генерируемый wsimport геттер не работает в ObjectMapper

Ниже приведен класс, сгенерированный wsimport — (Примечание getter name getOProposalData()) —

public class UpdateProposalRequest {
    protected ObjProposalData oProposalData;

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

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

Ниже приведены 2 обходных пути, которые я мог бы придумать для этой проблемы —

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

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

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

Существует ли способ управления форматом имени getter / setter при создании файлов класса?

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

Обновить —

Я обнаружил , что, расширяяPropertyNamingStrategy, мы сможем обеспечить нашу собственную конверсионную стратегию. Но я не могу получить преобразование правильно для вышеуказанного случая. Link — Link

Может ли кто — нибудь предоставить точную стратегию преобразования, необходимую в вышеуказанном случае?

1 ответ

  1. Я получил его работу с помощью 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);