Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java wsimport生成的getter在ObjectMapper中不工作_Java_Json_Web Services_Jackson_Wsimport - Fatal编程技术网

Java wsimport生成的getter在ObjectMapper中不工作

Java wsimport生成的getter在ObjectMapper中不工作,java,json,web-services,jackson,wsimport,Java,Json,Web Services,Jackson,Wsimport,下面是由wsimport生成的类-(注意getter namegetOProposalData())- 我正在尝试使用com.fasterxml.jackson.core(jackson数据绑定)中的ObjectMapper将字符串转换为上述类的对象- requestStr具有以下JSON- { "oProposalData": { . . . } } 当我运行应用程序时,它抛出以下异常-(注意-已知属性名-oproposalData)- 经过一番思前想

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

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

requestStr具有以下JSON-

{
    "oProposalData": {
    .
    .
    .
    }
}
当我运行应用程序时,它抛出以下异常-(注意-已知属性名-
oproposalData
)-

经过一番思前想后,我发现问题出在wsimport生成的getter名称上。如果我将其更改为
getoProposalData()
,则不会引发上述异常

下面是我可以想到的解决这个问题的两个变通方法-

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

  • 在使用wsimport生成类文件之后,使用类似eclipse的IDE自动生成getter和setter。(Eclipse将使用与ObjectMapper格式匹配的正确格式生成getter)

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

    在生成类文件时,是否有方法控制getter/setter名称格式

    或者,在调用readValue/writeValue时,是否有方法向ObjectMapper提供getter格式

    更新-

    我发现通过扩展
    属性名称策略
    ,我们将能够提供自己的转换策略。但我无法获得上述情况下的正确转换。链接--


    有人能提供在上述情况下所需的确切转换策略吗?

    我通过使用PropertyNamegStrategy实现了它,如下所示--

    使用上面的类对象,如下所示-

    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);
    
    com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "oProposalData" (class co.xxx.service.updateproposal.UpdateProposalRequest), not marked as ignorable (one known property: "oproposalData"])
    
    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);