Custom Jackson serializer of resteasy client

好久不见. 提交于 2019-12-04 03:42:09

问题


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?


回答1:


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.




回答2:


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...
        }
  }


来源:https://stackoverflow.com/questions/29012686/custom-jackson-serializer-of-resteasy-client

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!