规范化JavaBean属性名

规范化JavaBean属性名,java,javabeans,Java,Javabeans,我有一堆第三方Java类,它们对本质上相同的属性使用不同的属性名称: public class Foo { public String getReferenceID(); public void setReferenceID(String id); public String getFilename(); public void setFilename(String fileName); } public class Bar { public String get

我有一堆第三方Java类,它们对本质上相同的属性使用不同的属性名称:

public class Foo {
   public String getReferenceID();
   public void setReferenceID(String id);
   public String getFilename();
   public void setFilename(String fileName);
}

public class Bar {
   public String getRefID();
   public void setRefID(String id);
   public String getFileName();
   public void setFileName(String fileName);
}
我希望能够以规范化的形式解决这些问题,这样我就可以对它们进行多态处理,这样我就可以对Apache BeanUtils进行如下处理:

PropertyUtils.copyProperties(object1,object2);
显然,为每个类编写一个适配器是很简单的

public class CanonicalizedBar implements CanonicalizedBazBean {
    public String getReferenceID() {
        return this.delegate.getRefID();
    }
    // etc.
}

但我想知道有没有更普遍、更动态的东西?需要一对多属性名称等价映射和委托类,并生成适配器的东西?

我从未使用过它,但我想您正在寻找:

Dozer是一个JavaBean到JavaBean映射器,递归地复制数据 从一个物体到另一个物体。通常,这些javabean是 不同的复杂类型

Dozer支持简单属性映射、复杂类型映射、, 双向映射、隐式-显式映射以及 递归映射。这包括映射 还需要在元素级别进行映射

Dozer不仅支持属性名称之间的映射,还支持 自动在类型之间转换。大多数转换场景是 支持开箱即用,但推土机还允许您指定自定义 通过XML进行转换

  • 第一个选择是

  • 第二种选择是框架 稍作调整。使用Smook的图形映射器将是有益的

  • 另一个选项是使用自定义映射器


  • 也许是这样的:

    public class CanonicalizedBar implements CanonicalizedBazBean {
    public String getReferenceID() {
        Method m = this.delegate.getClass().getDeclaredMethod("getReferenceID");
        if(m == null)
            m = this.delegate.getClass().getDeclaredMethod("getRefID");
        ...
        return m.invoke();
    }
    // etc.
    }
    

    虽然,我个人从未使用过它。我注意到一个名为的项目被认为具有最好的性能和自动理解许多此类映射的能力。 无论如何,它还支持自定义映射,并使用生成的代码隐式定义适配器

    您还可以定义一个自定义映射器,也就是说,如果您知道如何规范化成员名称,那么您可以使用该知识构建一个适用于所有对象的映射。例如:

    DefaultFieldMapper myDefaultMapper = new DefaultFieldMapper() {
       public String suggestMapping(String propertyName, Type<?> fromPropertyType) {
          // split word according to camel case (apache commons lang)
          String[] words= StringUtils.splitByCharacterTypeCamelCase(propertyName);
          if(words[0].length() > 6) {
             // trim first camel-cased word of propery name to 3 letters
             words[0]= words[0].substring(0,2);
             return StringUtils.join(words);
          } else {
             // remains unchanged
             return propertyName;
          }   
       }
    }
    
    mapperFactory.registerDefaultFieldMapper(myDefaultMapper );
    
    DefaultFieldMapper myDefaultMapper=new DefaultFieldMapper(){
    公共字符串suggestMapping(字符串propertyName,类型fromPropertyType){
    //根据驼峰大小写拆分单词(apache commons lang)
    String[]words=StringUtils.splitByCharacterTypeCamelCase(propertyName);
    如果(字[0]。长度()>6){
    //将propery名称的第一个大小写单词修剪为3个字母
    字[0]=字[0]。子串(0,2);
    返回StringUtils.join(单词);
    }否则{
    //保持不变
    返回propertyName;
    }   
    }
    }
    registerDefaultFieldMapper(myDefaultMapper);
    
    我对它做的不多,但您可以使用它来完成这项工作

    我认为您应该能够做的是向每个内部调用实际方法的类添加一个方法。看这个,大约走了一半,它谈到了混合


    可能是最流行的实现。

    谢谢。似乎在没有不必要的中间阶段的情况下完成了确切的工作。