有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我如何告诉Jersey客户端对其反序列化的每个类执行@JsonIgnoreProperties(ignoreUnknown=true)的等效操作?

我用Jersey客户端反序列化了一个类。此类有一个如下所示的方法:

public boolean isEmpty() {
    return (code == null &&
            label == null &&
            codeSystem == null &&
            codeSystemLabel == null &&
            description == null &&
            concept == null &&
            alternateCode == null
    );

没有二传手。按原样,这将引发以下异常:

com.sun.jersey.api.client.ClientHandlerException: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "empty" (Class com.app.models.CodedElementModel), not marked as ignorable
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@3b927d51; line: 1, column: 270] (through reference chain: com.app.models.LabOrderModel["code"]->com.app.models.CodedElementModel["empty"])

I've read this article,事实证明我可以通过把这个注释放在CodedElementModel类上来解决这个问题:@JsonIgnoreProperties(ignoreUnknown = true)

问题是我有很多方法抛出这个异常。有没有办法将Jersey客户端配置为好像每个类上都设置了@JsonIgnoreProperties(ignoreUnknown = true),这样我就不必手动注释它们了?我不想通过手动添加此注释来更改约30个文件。如果有人在没有setter的情况下添加getter,这将防止将来出现此类错误

以下是我如何创建我的Jersey客户:

    DefaultClientConfig clientConfig = new DefaultClientConfig();
    clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
    Client client = Client.create(clientConfig);

我觉得clientConfig可能有这样的设置,但我不确定如何找到它


共 (4) 个答案

  1. # 1 楼答案

    您需要通过为Jersey Client实例化和配置JacksonJsonProvider来配置它

    泽西2号。x:

    JacksonJsonProvider jacksonJsonProvider = 
        new JacksonJaxbJsonProvider()
            .configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    
    client.register(jacksonJsonProvider);
    

    泽西V1。x:

    DefaultClientConfig clientConfig = new DefaultClientConfig();
    JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider().
        configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    clientConfig.getSingletons().add(jacksonJsonProvider);
    

    值得注意的是,根本问题是JSON包含字段“empty”。。。我想它之所以能达到目的,是因为你正在序列化同一个POJO。如果你真的不想在JSON中使用isEmpty()方法,那么注释该方法在序列化时被忽略不是更好吗

  2. # 2 楼答案

    接受了@sleske的回复,但在我使用com时,对我来说并不适用。太阳运动衫应用程序编程接口。客户客户端和com。fasterxml。杰克逊。贾克斯。json。JacksonJsonProvider。实际上对我有用的是

    ClientConfig config = new DefaultClientConfig();
    
    JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    config.getSingletons().add(jacksonJsonProvider);
    Client client = Client.create(config);
    

    干杯

  3. # 3 楼答案

    在客户端使用REST服务时,我遇到了同样的问题。以下是我的解决方案:

    1)将com.fasterxml.jackson.jaxrs添加到POM中,或将jar包含在项目中

    2)修改ClientConfig:

    JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider();
    jacksonJsonProvider.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    
    ClientConfig clientConfig = new DefaultClientConfig();
    clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
    clientConfig.getClasses().add(jacksonJsonProvider.getClass());
    
    Client client = Client.create(clientConfig);        
    
  4. # 4 楼答案

    您还可以构造自定义ObjectMapper,并使用它将其传入

    ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    final JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider(mapper, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS).configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    
    final Client    client  = ClientBuilder.newClient().register(jacksonJsonProvider);
    

    有了这种maven依赖

        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.6.6</version>
        </dependency> 
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>2.22.1</version>
        </dependency> 
    

    如本文所述https://jersey.java.net/documentation/latest/migration.html#mig-1-x-json