gpt4 book ai didi

java - 推土机字符串到枚举映射

转载 作者:太空狗 更新时间:2023-10-29 22:45:00 24 4
gpt4 key购买 nike

我有这样的枚举:

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

我需要将它转换为字符串,反之亦然。 现在,它由自定义转换器完成。但我想通过推土机映射(如果可能的话)来完成。如果我不向推土机配置写入任何映射,我会得到

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

异常。我无法将默认公共(public)构造函数添加到枚举,因为这是不可能的。所以,我用内部代码和 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>

它不起作用。我尝试了 valueOfCode(),单向映射。什么都不管用。枚举到字符串的转换也不起作用,我得到空字符串。有什么想法吗?

最佳答案

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

@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 通用语言库。但除此之外,还有一个简单的反射(reflection)来解决这个问题。只需添加到实现 CustomConverter 的类,然后在您的推土机映射 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 - 推土机字符串到枚举映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8267499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com