我有一个在 JAX-RS(RestEasy 风格)上运行的后端服务器。
一些端点响应包含 日期,,我希望将其格式化为 ISO 字符串。
@Value // Lombok annotation
public class MyResponse {
String someDateAsString;
}
因为我不希望转换由each开发人员在each响应中“即兴”进行,所以我将其标准化:
@Value
public class MyResponse {
LocalDateTime someDate;
}
并且我通过使用 Jackson 的相应设置使转换自动发生:
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JacksonDatatypeProducer implements ContextResolver<ObjectMapper> {
private final ObjectMapper mObjectMapper;
public JacksonDatatypeProducer() {
this.mObjectMapper = new ObjectMapper()
.findAndRegisterModules()
.configure(WRITE_DATES_AS_TIMESTAMPS, false); // <-- where the magic happens
}
@Override
public ObjectMapper getContext(final Class<?> objectType) {
return mObjectMapper;
}
}
这很好用,我在前端将日期作为 ISO 字符串获取。
问题:
我的后端也是许多第三方服务的消费者。 它们通过
javax.ws.rs.client.Client
的各种实例来调用。
框架知道如何自动注入它们,因为存在这种类:
public class HttpClientProducer {
private final ResteasyClient mClient;
@Inject
HttpClientProducer(final Logger logger) {
mClient = ((ResteasyClientBuilder) ClientBuilder.newBuilder().register(new JacksonDatatypeProducer()))
.build();
}
@Produces
@ApplicationScoped
public Client getClient() {
return mClient;
}
}
我希望我的后端(作为服务器)拥有其自己的杰克逊配置。我确实不希望它与所有第三方客户端共享相同的设置(尤其是
WRITE_DATES_AS_TIMESTAMPS
设置)。
我无法理解告诉服务器(并且仅是服务器)的正确方法明确要使用哪个杰克逊设置。即有太多神奇的连接,我不知道在实例化流程中在哪里起作用——无论是显式的还是隐式的位置。
我一直在寻找与此类似的类
HttpClientProducer
,但旨在将后端实例化为服务器。好像没有啊
我的尝试:
首先我想知道为什么
JacksonDatatypeProducer
是在HttpClientProducer
中手动实例化的。 这是遗留代码中的“错误”吗? IE。如果要实例化 same
JacksonDatatypeProducer
无论如何,他们为什么不使用依赖注入?
如果您使用的是旧版本的 Jakarta REST 和 RESTEasy 注释,您应该能够使用
jakarta.ws.rs.ConstrainedTo
或 javax.ws.rs.ConstrainedTo
。您已为客户端注释了 ContextResolver
,并为服务器注释了 @ConstrainedTo(RuntimeType.CLIENT)
。