PropertyEditorSupport的使用

今天看spring1.1.1的源码的时候,看到这个东西,以前从来没见过的啊,后来看了下,

首先这个类是属于java.beans包中的内容,发现以前没怎么注意这个包里面的东西,这个包中都是一定了一些关于bean的操作的类.

发现以前啊,都是使用xml什么的格式来进行bean的定义啊,配置的,

所有就有了这个进行字符串的解析变成bean,再进行调用就方便多了,下面是示例:

实体类:

package com.demo;

import java.util.Date;

public class User {


   private String name;
   private String email;
   private Date date;


   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public String getEmail() {
      return email;
   }
   public void setEmail(String email) {
      this.email = email;
   }
   public Date getDate() {
      return date;
   }
   public void setDate(Date date) {
      this.date = date;
   }

   @Override
   public String toString() {
      return "NodeDO [name=" + name + ", email=" + email + ", date=" + UserEditor.sdf.format(date) + "]";
   }
}
 

包含实体类的节点类:

package com.demo;

public class Node {
   private String nodeName;
   private User user;

   public String getNodeName() {
      return nodeName;
   }
   public void setNodeName(String nodeName) {
      this.nodeName = nodeName;
   }
   public User getUser() {
      return user;
   }
   public void setUser(User user) {
      this.user = user;
   }


}
 

package com.demo;

import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * 编辑器
 */
public class UserEditor extends PropertyEditorSupport {
   
   public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

   /**
    * 重写从一个字符串String变成bean的方法
    */
   @Override
   public void setAsText(String text) throws IllegalArgumentException{
      String[] tokens = text.split("\\|");
      User user = new User();
      user.setName(tokens[0]);
      user.setEmail(tokens[1]);
      try{
         user.setDate(sdf.parse(tokens[2]));
      }catch(ParseException e){
         throw new IllegalArgumentException(e);
      }
      setValue(user);
   }
}

 
package com.demo;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.beans.PropertyEditor;
import java.beans.PropertyEditorManager;
import java.lang.reflect.Method;
import java.util.Map;

/**
 * 转换类
 */
public class PropertyEditorSample {

    /**
     * 进行转换
     */
    public static Node convert(Map<String, String> parameters)throws Exception {
       //注册bean的编辑器,放到一个WeakHashMap中
        PropertyEditorManager.registerEditor(User.class, UserEditor.class);
        Node node = new Node();
      BeanInfo bi = Introspector.getBeanInfo(Node.class);
      //获取所有的属性
        PropertyDescriptor[] pds = bi.getPropertyDescriptors();
        for(PropertyDescriptor pd : pds){
           Class<?> propertyType = pd.getPropertyType();
           Method writeMethod = pd.getWriteMethod();
           if(propertyType == Class.class){
              //ignore
           }else if(propertyType == String.class){
            writeMethod.invoke(node, parameters.get(pd.getName()));
         }else{
               //根据类型查找bean的编辑器,获取到了UserEditor的实例
            PropertyEditor editor = PropertyEditorManager.findEditor(propertyType);
            if(editor != null){
               editor.setAsText(parameters.get(pd.getName()));
               writeMethod.invoke(node, editor.getValue());
            }else{
               System.out.println("no editor for:"+pd.getName());
            }
         }
        }
        return node;
   }

}
 

测试用例:

import java.util.HashMap;
import java.util.Map;

/**
 * @author zk
 * @Description: 测试用例
 * @date 2018-10-08 15:22
 */
public class Test {

    public static void main(String[] args) throws Exception {
        Map<String, String> parameters = new HashMap<String, String>(){
            {
                //这里的key要和Node里面的属性名一致
                put("nodeName", "曹操");
                put("user", "zhaoJun|changhe@163.com|2018-10-08 15:06:00");
            }
        };
        Node convert = PropertyEditorSample.convert(parameters);
        System.out.println(convert.getNodeName());
        System.out.println(convert.getUser());
    }
}
 

很简单的东西,只是把一些类里面的属性多封装了几层.

2018年10月8日15:29:48

### 使用 `BeanUtils.copyProperties` 实现 Long 到 String 的字段转换 当使用 `BeanUtils.copyProperties` 处理不同类型的相同字段名时,由于默认情况下该方法执行的是浅拷贝操作,并不会自动处理类型转换。因此,在尝试将 `Long` 类型的数据映射到 `String` 类型的目标属性时,可能会抛出异常。 为了实现这种特定场景下的数据迁移,可以通过自定义 Converter 或者利用 ModelMapper 等更强大的库来完成这项工作。不过如果希望继续沿用 Spring 提供的基础工具,则可以在调用之前手动设置目标对象的相关属性值: ```java // 定义源实体类 public class Source { private Long id; public void setId(Long id) { this.id = id; } // getter... } // 定义目的实体类 public class Target { private String id; public void setId(String id) { this.id = id; } // getter... } ``` 对于上述情况的一种解决方案是在实际调用 `copyProperties()` 方法前先做一次预处理: ```java Source source = new Source(); source.setId(1L); Target target = new Target(); if (source.getId() != null){ target.setId(source.getId().toString()); } BeanUtils.copyProperties(source, target); ``` 这种方法虽然简单有效,但在面对大量相似需求时显得不够优雅。另一种更为推荐的方式是创建一个通用的处理器用于解决此类问题,通过继承并扩展 `PropertyEditorSupport` 来支持基本数值向字符串的转换功能[^3]。 此外需要注意的是,直接修改或覆盖框架自带的方法并不是一个好的实践方式;相反应该寻找合适的替代方案或是借助其他成熟的第三方组件如 Dozer、MapStruct 等来进行更加复杂的对象间映射任务[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值