Java wsimport生成的getter在ObjectMapper中不工作
下面是由wsimport生成的类-(注意getter nameJava wsimport生成的getter在ObjectMapper中不工作,java,json,web-services,jackson,wsimport,Java,Json,Web Services,Jackson,Wsimport,下面是由wsimport生成的类-(注意getter namegetOProposalData())- 我正在尝试使用com.fasterxml.jackson.core(jackson数据绑定)中的ObjectMapper将字符串转换为上述类的对象- requestStr具有以下JSON- { "oProposalData": { . . . } } 当我运行应用程序时,它抛出以下异常-(注意-已知属性名-oproposalData)- 经过一番思前想
getOProposalData()
)-
我正在尝试使用com.fasterxml.jackson.core(jackson数据绑定)中的ObjectMapper将字符串转换为上述类的对象-
requestStr具有以下JSON-
{
"oProposalData": {
.
.
.
}
}
当我运行应用程序时,它抛出以下异常-(注意-已知属性名-oproposalData
)-
经过一番思前想后,我发现问题出在wsimport生成的getter名称上。如果我将其更改为getoProposalData()
,则不会引发上述异常
下面是我可以想到的解决这个问题的两个变通方法-
@JsonProperty(“oProposalData”)
属性名称策略
,我们将能够提供自己的转换策略。但我无法获得上述情况下的正确转换。链接--
有人能提供在上述情况下所需的确切转换策略吗?我通过使用PropertyNamegStrategy实现了它,如下所示-- 使用上面的类对象,如下所示-
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);
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "oProposalData" (class co.xxx.service.updateproposal.UpdateProposalRequest), not marked as ignorable (one known property: "oproposalData"])
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);