Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Dozer字符串到枚举映射_Java_String_Enums_Mapping_Dozer - Fatal编程技术网

Java Dozer字符串到枚举映射

Java Dozer字符串到枚举映射,java,string,enums,mapping,dozer,Java,String,Enums,Mapping,Dozer,我有这样的列举: public enum PartnershipIndicator { VENDOR("VENDOR"), COPARTNER("COPARTNER"), BUYER("BUYER"); String code; private PartnershipIndicator(String code) { this.code = code; } public String getCode() { return

我有这样的列举:

public enum PartnershipIndicator {
    VENDOR("VENDOR"), COPARTNER("COPARTNER"), BUYER("BUYER");

    String code;

    private PartnershipIndicator(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }

    public static PartnershipIndicator valueOfCode(String code) {
        for (PartnershipIndicator status : values()) {
            if (status.getCode().equals(code)) {
                return status;
            }
        }
        throw new IllegalArgumentException(
            "Partnership status cannot be resolved for code " + code);
    }

    @Override
    public String toString() {
        return code;
    }
}
我需要将其转换为字符串,反之亦然。现在,它是由自定义转换器完成的。但是我想通过dozer映射来实现(如果可能的话)。如果我不写任何映射到dozer confing,我会

org.dozer.MappingException: java.lang.NoSuchMethodException: by.dev.madhead.demo.test_java.model.PartnershipIndicator.<init>()
org.dozer.MappingException:java.lang.NoSuchMethodException:by.dev.madhead.demo.test\u java.model.PartnershipIndicator.()
例外。我无法将默认公共构造函数添加到枚举,因为这是不可能的。因此,我用内部代码和valueOfCode()/toString()编写了一个技巧。它不起作用。然后,我将其映射到推土机配置中:

<mapping>
    <class-a>java.lang.String</class-a>
    <class-b create-method="valueOfCode">by.dev.madhead.demo.test_java.model.PartnershipIndicator</class-b>
</mapping>

java.lang.String
by.dev.madhead.demo.test_java.model.PartnershipIndicator
它不起作用。我尝试了valueOfCode(),单向映射。什么都不管用。枚举到字符串的转换也不起作用,我得到了空字符串。
有什么想法吗?

在Dozer中没有默认的枚举到字符串映射。请参阅推土机文档。所以你有两个选择:

  • 您可以编写使用泛型处理任何枚举的自定义转换器
  • 或者,您可以向Dozer提交补丁,将enumString映射添加到默认映射

不确定这是否仍然是一个问题,但可能对搜索的任何人都有帮助。但这里有一个解决方案:

@Override
public Object convert(Object destination, Object source, Class<?> destinationClass,    Class<?> sourceClass) {
    if(source == null)
        return null;
    if(destinationClass != null){
        if(destinationClass.getSimpleName().equalsIgnoreCase("String")){
            return this.getString(source);
        }else if( destinationClass.isEnum()){

            return this.getEnum(destinationClass, source);

        }else{
            throw new MappingException(new StrBuilder("Converter ").append(this.getClass().getSimpleName())
                       .append(" was used incorrectly. Arguments were: ")
                       .append(destinationClass.getClass().getName())
                       .append(" and ")
                       .append(source).toString());
        }
    }
    return null;
}

private Object getString(Object object){
    String value = object.toString();
    return value;
}
private Object getEnum(Class<?> destinationClass, Object source){
    Object enumeration = null;

    Method [] ms = destinationClass.getMethods();
    for(Method m : ms){
        if(m.getName().equalsIgnoreCase("valueOf")){
            try {
                enumeration = m.invoke( destinationClass.getClass(), (String)source);
            }
            catch (IllegalArgumentException e) {
                e.printStackTrace();
            }
            catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            catch (InvocationTargetException e) {
                e.printStackTrace();
            }
            return enumeration;
        }
    }
    return null;
}
@覆盖
公共对象转换(对象目标、对象源、类目标类、类源类){
if(source==null)
返回null;
if(destinationClass!=null){
if(destinationClass.getSimpleName().equalsIgnoreCase(“字符串”)){
返回此.getString(源);
}else if(destinationClass.isEnum()){
返回此.getEnum(destinationClass,source);
}否则{
抛出新的映射异常(新的StrBuilder(“转换器”).append(this.getClass().getSimpleName())
.append(“未正确使用。参数为:”)
.append(destinationClass.getClass().getName())
.附加(“和”)
.append(source.toString());
}
}
返回null;
}
私有对象getString(对象对象){
字符串值=object.toString();
返回值;
}
私有对象getEnum(类destinationClass,对象源){
对象枚举=空;
方法[]ms=destinationClass.getMethods();
用于(方法m:ms){
if(m.getName().equalsIgnoreCase(“valueOf”)){
试一试{
枚举=m.invoke(destinationClass.getClass(),(字符串)源);
}
捕获(IllegalArgumentException e){
e、 printStackTrace();
}
捕获(非法访问例外e){
e、 printStackTrace();
}
捕获(调用TargetException e){
e、 printStackTrace();
}
返回枚举;
}
}
返回null;
}
生成异常消息时的StrBuilder类来自apaches公共语言库。但除此之外,还有一个简单的思考来解决这个问题。只需添加到实现CustomConverter的类,然后在dozer映射xml文件中添加以下配置:

<configuration>
    <custom-converters>
        <converter type="com.yourcompany.manager.utils.dozer.converters.EnumStringBiDirectionalDozerConverter">
            <class-a>java.lang.Enum</class-a>
            <class-b>java.lang.String</class-b>
        </converter>
    </custom-converters>
</configuration>

java.lang.Enum
java.lang.String

请注意,您只能在所有映射文件(如果有多个)之间列出一次配置,否则推土机会抱怨。为了简单起见,我通常将自定义转换器配置放在一个文件中。希望这有帮助

我已将自定义转换器添加到推土机主机。因此,5.4版中没有人不会面对这个问题:)@所有人都可以对此进行调查,看起来2018年的情况仍然如此。推土机项目似乎处于休眠状态。我们在当前项目中使用ModelMapper。