繁体   English   中英

Dozer String to enum mapping

[英]Dozer String to enum mapping

我有这样的枚举:

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;
    }
}

我需要将其转换为String,反之亦然。 现在,它由自定义转换器完成。 但我想通过推土机映射(如果有可能)这样做。 如果我不写任何映射到推土机confing,我得到

org.dozer.MappingException: java.lang.NoSuchMethodException: by.dev.madhead.demo.test_java.model.PartnershipIndicator.<init>()

例外。 我不能将默认的公共构造函数添加到枚举中,因为它是不可能的。 所以,我用内部代码和valueOfCode()/ toString()写了一个技巧。 这是行不通的。 然后,我在dozer配置中映射它:

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

这是行不通的。 我尝试了valueOfCode(),单向映射。 什么都行不通。 Enum to String转换也不起作用,我得到空字符串。 有任何想法吗?

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

@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;
}

构建异常消息时的StrBuilder类来自apaches common-lang libs。 但除此之外,还有一个简单的反思来解决这个问题。 只需添加到实现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>

请注意,您只能在所有映射文件之间列出一次配置(如果您有多个),否则dozer会抱怨。 我通常做的是将我的自定义转换器配置放在一个文件中以简化操作。 希望这可以帮助!

Dozer中没有String映射的默认枚举。 请参阅Dozer文档中的数据类型转换 所以你有两个选择:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM