下面是wsimport生成的类 - (注意getter name getOProposalData()
) -
public class UpdateProposalRequest {
protected ObjProposalData oProposalData;
public ObjProposalData getOProposalData() {
return oProposalData;
}
public void setOProposalData(ObjProposalData value) {
this.oProposalData = value;
}
}
我正在尝试使用com.fasterxml.jackson.core中的ObjectMapper将字符串转换为上面的对象(jackson-databind) -
private ObjectMapper mapper = new ObjectMapper();
UpdateProposalRequest requestObject = mapper.readValue(requestStr, UpdateProposalRequest.class);
requestStr具有以下JSON -
{
"oProposalData": {
.
.
.
}
}
当我运行应用程序时,它会抛出以下异常 - (注意 - 已知属性名称 - oproposalData
) -
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "oProposalData" (class co.xxx.service.updateproposal.UpdateProposalRequest), not marked as ignorable (one known property: "oproposalData"])
稍微刮了一下后,我发现问题出在wsimport生成的getter名称上。如果我将其更改为getoProposalData()
,则不会抛出上述异常。
以下是我能想到的2个解决方法 -
对于每个getter方法,为ObjectMapper添加以下注释以选择正确的字段名称 -
@JsonProperty("oProposalData")
使用wsimport生成类文件后,使用像eclipse这样的IDE来自动生成getter和setter。 (Eclipse将使用与ObjectMapper格式匹配的正确格式生成getter。)
这些方法的问题在于我有数百个这样的类文件有多个字段。因此,手动添加注释或生成getter和setter将花费大量时间。此外,对WSDL文件的任何小改动都将导致重新生成类文件并再次手动更改getter名称。
有没有办法在生成类文件时控制getter / setter名称格式?
或者有没有办法在调用readValue / writeValue时向ObjectMapper提供getter格式?
更新 -
我发现通过扩展PropertyNamingStrategy
,我们将能够提供自己的转换策略。但我无法获得上述案例的转换权。链接 - Link
有人可以提供上述案例所需的确切转换策略吗?
答案 0 :(得分:0)
我使用PropertyNamingStrategy进行工作,如下所示 -
public class MyNameStrategy extends PropertyNamingStrategy {
@Override
public String nameForField(MapperConfig config, AnnotatedField field, String defaultName) {
return convertFieldName(field.getName());
}
@Override
public String nameForGetterMethod(MapperConfig config, AnnotatedMethod method, String defaultName) {
return convertMethodName(method.getName(),defaultName);
}
@Override
public String nameForSetterMethod(MapperConfig config, AnnotatedMethod method, String defaultName) {
return convertMethodName(method.getName(),defaultName);
}
public String convertMethodName(String methodName,String defaultName) {
if(methodName.compareTo("isEmpty")==0 || methodName.compareTo("isNaN")==0 || methodName.compareTo("isInfinite")==0) {
return defaultName;
}
return convertFieldName(methodName.substring(3));
}
public String convertFieldName(String fieldName) {
char[] arr=fieldName.toCharArray();
if(arr.length!=0) {
if(Character.isUpperCase(arr[0])){
char lower = Character.toLowerCase(arr[0]);
arr[0] = lower;
}
}
return new StringBuilder().append(arr).toString();
}
}
使用上面的类对象 -
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(new MyNameStrategy());
UpdateProposalRequest requestObject=mapper.readValue(request, UpdateProposalRequest.class);