resteasy 客户端的自定义 Jackson 序列化器
Custom Jackson serializer of resteasy client
是否可以为 resteasy 客户端注册自定义 Jackson JSON 序列化程序?
我试过这样做:
ResteasyClient client = new ResteasyClientBuilder()
.register(new CustomSerializer())
.build();
但是没有用。有什么想法吗?
您只能注册 Providers or Features 等 JAX-RS 组件。
您需要注册一个带有 ObjectMapper 的 Provider,该 ObjectMapper 带有一个已注册序列化程序的 Module。
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();
请注意,此示例使用的是 org.codehaus.jackson
中的 类。 com.fasterxml.jackson
中的 API 看起来略有不同。
备选方案
查看源代码,ResteasyJackson2Provider
有如下注解
@Provider
@Consumes({"application/*+json", "text/json"})
@Produces({"application/*+json", "text/json"})
所以我更喜欢创建一个带有特定注释的提供程序 class 以确保它会被首先选择:
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...
}
}
是否可以为 resteasy 客户端注册自定义 Jackson JSON 序列化程序?
我试过这样做:
ResteasyClient client = new ResteasyClientBuilder()
.register(new CustomSerializer())
.build();
但是没有用。有什么想法吗?
您只能注册 Providers or Features 等 JAX-RS 组件。 您需要注册一个带有 ObjectMapper 的 Provider,该 ObjectMapper 带有一个已注册序列化程序的 Module。
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();
请注意,此示例使用的是 org.codehaus.jackson
中的 类。 com.fasterxml.jackson
中的 API 看起来略有不同。
备选方案
查看源代码,ResteasyJackson2Provider
有如下注解
@Provider
@Consumes({"application/*+json", "text/json"})
@Produces({"application/*+json", "text/json"})
所以我更喜欢创建一个带有特定注释的提供程序 class 以确保它会被首先选择:
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...
}
}