java - Jax-rs 根据 Jackson 的请求更改序列化响应

标签 java jackson jersey jax-rs

当前面临一个问题,我想根据传递到响应中的一些信息来更改 jax-rs 资源的响应。需要改变的是一些json的格式。目前我正在使用 jax @Provider 和 ContextResolver 注册一个 ObjectMapper。但是,每个资源类仅调用一次 getContext() 方法。不可能根据每个请求来更改此设置。

是否可以在 ContainerResponseFilter 中注入(inject)或访问 ObjectMapper?

@Provider
public class ObjectMapperResolver implements ContextResolver<ObjectMapper> {

    @Context
    private HttpServletRequest httpRequest;

    private final ObjectMapper mapper;

    public ObjectMapperContextResolver() {
        mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addDeserializer(Date.class, new DateDeserializer("some data format"));
        mapper.registerModule(module);
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return getMapperBasedOnRequest();
    }

    private ObjectMapper getMapperBasedOnRequest() {
        if (true) {
            return mapper;
        } else {
            return //something else;
        }
    }

    private boolean containsLegacyHeader() {
        return //get some information from the request headers or body
    }
}

最佳答案

我决定通过使用过滤器来解决这个问题,该过滤器将根据请求中提供的参数(在本例中为 header )进行调用。

public class DemoFilter implements ContainerResponseFilter {

    private final String UTC = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
    private final String OTHER = "yyyy-MM-dd";

    public static final String DATE_UTC = "utc";

    private String getMapperBasedOnRequest(ContainerRequestContext requestContext) {
        if (checkHeader(requestContext)) {
            return OTHER;
        } else {
            return UTC;
        }
    }

    private boolean checkHeader(ContainerRequestContext requestContext) {
        return //check header
    }

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {

        ObjectWriterInjector.set(new DateMod(getMapperBasedOnRequest(requestContext)));

    }

    public static class DateMod extends ObjectWriterModifier {

        private String df;

        public DateMod(String df) {
            this.df = df;
        }


        @Override
        public ObjectWriter modify(EndpointConfigBase<?> endpointConfigBase, MultivaluedMap<String, Object> multivaluedMap, Object o, ObjectWriter objectWriter, JsonGenerator jsonGenerator) throws IOException {
            return objectWriter.with(new SimpleDateFormat(dateFormat));

        }
    }

}

关于java - Jax-rs 根据 Jackson 的请求更改序列化响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45331894/

相关文章:

java - Jersey:无法从 String 中反序列化 ArrayList 的实例

java - 从接口(interface)设置 Jersey 响应状态代码而不返回 Response

java - 如何在 Jersey 中映射以分号分隔的 PathParams?

java - Java中完美圆到完美圆和完美圆到直线碰撞处理

java - 弹出窗口中的Android GridLayout不显示数据

java - 如何在 java 中创建一个复杂的 json 对象?

java - jackson 2.0 Jersey 1.12

java - 是否可以序列化/反序列化多级 json 对象?

java - 在 Linux 上使用 Java 对 Active Directory 进行身份验证

java - 如何在Java程序中运行exe文件