wsimport生成的getter在ObjectMapper

时间:2016-12-26 10:46:15

标签: java json web-services jackson wsimport

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

public class UpdateProposalRequest {
    protected ObjProposalData oProposalData;

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

我正在尝试使用com.fasterxml.jackson.core中的ObjectMapper将字符串转换为上面的对象(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生成的getter名称上。如果我将其更改为getoProposalData(),则不会抛出上述异常。

以下是我能想到的2个解决方法 -

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

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

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

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

    或者有没有办法在调用readValue / writeValue时向ObjectMapper提供getter格式?

    更新 -

    我发现通过扩展PropertyNamingStrategy,我们将能够提供自己的转换策略。但我无法获得上述案例的转换权。链接 - Link

    有人可以提供上述案例所需的确切转换策略吗?

1 个答案:

答案 0 :(得分: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);