2016-12-26 4 views
0

Ниже приводится класс, порожденный wsimport - (обратите внимание на имя геттер getOProposalData()) -wsimport генерироваться добытчика не работает в ObjectMapper

public class UpdateProposalRequest { 
    protected ObjProposalData oProposalData; 

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

Я пытаюсь преобразовать преобразовать строку в объект выше класса с использованием ObjectMapper от ком .fasterxml.jackson.core (джексон-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 , Если я изменю его на getoProposalData(), то указанное выше исключение не будет выбрано.

Ниже приведены 2 обходные пути я мог думать по этому вопросу -

  1. Для каждого метода газопоглотительного, добавьте ниже аннотацию для ObjectMapper, чтобы выбрать правильное имя поля - @JsonProperty("oProposalData")

  2. После генерации файла класса с помощью wsimport используйте IDE, например eclipse, чтобы автоматически генерировать геттеры и сеттер. (Eclipse будет генерировать геттер с соответствующим форматом, который соответствует формату ObjectMapper).

Проблема с этими методами заключается в том, что у меня есть сотни таких файлов классов, имеющих несколько полей. Таким образом, вручную добавление аннотации или генерация геттеров и сеттеров потребует много времени. Также любое небольшое изменение в файле WSDL приведет к регенерации файлов классов и повторному изменению имен получателей вручную.

Есть ли способ управлять форматом имени получателя/сеттера при создании файлов классов?

Или есть способ предоставить формат getter ObjectMapper при вызове readValue/writeValue?

Update -

Я обнаружил, что за счет расширения 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);