javaweb-servicesjacksoninvocation

How can I ignore unrecognized properties using javax.ws.rs.client.Invocation.Builder?


I have built a web client which uses SSL.

The client is initialized like this:

SSLContext sc = SSLContext.getInstance("ssl");
        sc.init(null, noopTrustManager, null);
        
        this.client = ClientBuilder.newBuilder().
                sslContext(sc).
                build();

Then the web target is initialized like this:

this.webTarget = this.client.target(urlAddress);

And the Invocation Builder is initialized like this:

Builder request = this.webTarget.request();

But when - after setting the headers appropriately - I try to do this:

request.get(InitiateTransferResponse.class);

I get the following error message:

javax.ws.rs.client.ResponseProcessingException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "timestamp" (class com.interaxa.ivr.visual.moa.service.model.InitiateTransferResponse), not marked as ignorable

Is there a way to tell the builder to ignore all unrecognized properties? (I intend to use this same builder for other web services too, and it would be nice if I could set it to ignore unknown properties permanently, regardless of the response class).

Thank you in advance.


Solution

  • I have found a solution!

    The key is to replace the line: request.get(InitiateTransferResponse.class);

    By this code:

            InitiateTransferResponse result;
            try {
                result = getMapper().readValue(response, InitiateTransferResponse.class);
            } 
            catch (IOException e) {
                ViewFactory.logError(e);
                result = null;
            }
    

    Where getMapper() is as follows:

    public ObjectMapper getMapper() {
            if (mapper == null){
                mapper = new ObjectMapper();
                mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
                mapper.configure(DeserializationConfig.Feature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
                mapper.setSerializationInclusion(Inclusion.NON_NULL);
            }
            return mapper;
    }
    

    And ObjectMapper is org.codehaus.jackson.map.ObjectMapper.

    This way, the ObjectMapper controls what it lets through rather than leaving that decision to the Builder.