JAX-RS:几个不同的ContextResolver<ObjectMapper>?

问题描述 投票:0回答:1

我有一个在 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
无论如何,他们为什么不使用依赖注入?

jax-rs resteasy
1个回答
0
投票

如果您使用的是旧版本的 Jakarta REST 和 RESTEasy 注释,您应该能够使用

jakarta.ws.rs.ConstrainedTo
javax.ws.rs.ConstrainedTo
。您已为客户端注释了
ContextResolver
,并为服务器注释了
@ConstrainedTo(RuntimeType.CLIENT)
    

© www.soinside.com 2019 - 2024. All rights reserved.