【问题标题】:Jax-rs alter serialization response based on request with jacksonJax-rs 根据杰克逊的请求改变序列化响应
【发布时间】:2018-01-02 01:37:47
【问题描述】:

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

是否可以在 ContainerResponseFilter 中注入或访问 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
    }
}

【问题讨论】:

    标签: java jackson jersey jax-rs


    【解决方案1】:

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

    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));
    
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 2020-12-24
      • 2015-04-07
      相关资源
      最近更新 更多