2016-12-26 120 views
0

不工作下面是wsimport生成的类 - 我试图从COM转换成字符串转换为使用ObjectMapper上面的类的对象的wsimport产生的吸气剂ObjectMapper

public class UpdateProposalRequest { 
    protected ObjProposalData oProposalData; 

    public ObjProposalData getOProposalData() { 
     return oProposalData; 
    } 
    public void setOProposalData(ObjProposalData value) { 
     this.oProposalData = value; 
    } 
} 

- (注意吸气名getOProposalData()) .fasterxml.jackson.core(杰克逊 - 数据绑定) -

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产生的吸气名后。如果我将其更改为getoProposalData(),则不会抛出上述异常。

下面是2个解决方法我能想到的问题 -

  1. 对于每一个getter方法,添加下面的注释为ObjectMapper挑选正确的字段名称 - @JsonProperty("oProposalData")

  2. 在用wsimport生成类文件后,使用像eclipse这样的IDE来自动生成getter和setter。 (Eclipse将生成具有匹配ObjectMapper格式的适当格式的getter)。

这些方法的问题是我有几百个这样的类文件有多个字段。因此,手动添加注释或生成getter和setter会花费很多时间。此外,对WSDL文件的任何小改动都会导致重新生成类文件,并再次手动更改getter名称。

有没有办法在生成类文件时控制getter/setter名称格式?

或者是否有一种方法可以在调用readValue/writeValue的同时向ObjectMapper提供getter格式?

更新 -

我发现,通过扩展PropertyNamingStrategy,我们将能够提供我们自己的变频战略。但我无法为上述情况获得转换权。链接 - Link

任何人都可以提供上述情况下所需的确切转换策略吗?

回答

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