【问题标题】:wsimport generated getter not working in ObjectMapperwsimport 生成的 getter 在 ObjectMapper 中不起作用
【发布时间】:2016-12-26 10:46:15
【问题描述】:

下面是wsimport生成的类-(注意getter名字getOProposalData())-

public class UpdateProposalRequest {
    protected ObjProposalData oProposalData;

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

我正在尝试使用 com.fasterxml.jackson.core (jackson-databind) 中的 ObjectMapper 将字符串转换为上述类的对象-

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 生成的 getter 名称上。如果我把它改成getoProposalData(),那么上面的异常就不会抛出了。

以下是我能想到的解决此问题的两种解决方法 -

  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

谁能提供上述案例所需的确切转化策略?

【问题讨论】:

    标签: java json web-services jackson wsimport


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 2016-09-21
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 2016-09-12
      相关资源
      最近更新 更多