2016-12-26 54 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);