4

Is it possible to register a custom Jackson JSON serializer for the resteasy client?

I've tried to do something like:

ResteasyClient client = new ResteasyClientBuilder()
            .register(new CustomSerializer())
            .build();

But it didn't work. Any ideas?

DavidPostill
  • 7,734
  • 9
  • 41
  • 60
Chico Sokol
  • 1,254
  • 3
  • 16
  • 24

2 Answers2

13

You can only register JAX-RS components like Providers or Features. You need to register an Provider which carries an ObjectMapper which carries an Module with your serializer registered.

ResteasyJacksonProvider resteasyJacksonProvider = new ResteasyJacksonProvider();
ObjectMapper mapper = new ObjectMapper();
SimpleModule myModule = new SimpleModule("myModule", new Version(1, 0, 0, null));
myModule.addSerializer(Custom.class, new CustomSerializer());
mapper.registerModule(myModule);
resteasyJacksonProvider.setMapper(mapper);
ResteasyClient client = new ResteasyClientBuilder().register(resteasyJacksonProvider).build();

Note that this example is using the classes from org.codehaus.jackson. The API from com.fasterxml.jackson looks slightly different.

lefloh
  • 10,653
  • 3
  • 28
  • 50
  • 6
    This will not work - at least with the current libraries. The ResteasyClientBuilder's internal provider factory will ignore your resteasyJacksonProvider instance registration because the ResteasyJacksonProvider class is already registered. The solution is to register an instance of a subclass instead - anonymous will do. – Dave Apr 19 '18 at 02:38
1

Alternative solution

Looking into the source code, ResteasyJackson2Provider has the following annotations

    @Provider
    @Consumes({"application/*+json", "text/json"})
    @Produces({"application/*+json", "text/json"})

so I have preferred to create a provider class with specific annotations to be sure it will be chosen first:

    public class RestEasyClientJackson {
        private ObjectMapper mapper;

        private JacksonJsonProvider provider;

        private Client client;

        @Before
        public void setUp() throws Exception {
           mapper = new ObjectMapper();
           mapper = mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

           provider = new MyProvider(mapper);

           client = ClientBuilder.newBuilder().register(provider).build();
        }

        @Provider
        @Produces(MediaType.APPLICATION_JSON)
        @Consumes(MediaType.APPLICATION_JSON)
        class MyProvider extends JacksonJsonProvider {
            MyProvider(ObjectMapper mapper) {
               super(mapper);
        }

        @Test
        public void myTest() throws Exception {
            // some test code...
        }
  }