Меня попросили украсить стандартный Jackson JSON, исходящий из конечной точки RestEasy. Я провел некоторое исследование Jackson и написал отдельный код, чтобы иметь возможность подавлять нули, настраивать форматы данных и т.д. Теперь проблема заключается в том, чтобы внедрить этот код в JSON-сериализацию RestEasy.
Судя по сообщениям на форуме, это тривиально в Spring, но не похоже на то, что это так в RestEasy. Я написал ContextResolver и настроил его как resteasy.provider в контекстных параметрах в web.xml (на Tomcat), но это не позволяет webapp загружаться на Tomcat.
Теперь я пытаюсь расширить javax.ws.rs.core.Application и предоставить ContextResolver, но ничего не получается. Так ли это просто, делал ли кто-нибудь это? Любая помощь будет высоко оценена.
Хорошо, я понял это, я смог сделать это, написав собственный JacksonJsonProvider на основе FAQ по Джексону: JAX-RS . Код выглядит следующим образом:
@Provider
public class QBOJacksonJsonProvider extends JacksonJsonProvider {
public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
@Override
public void writeTo(Object value, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String,Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
Log.info(getClass(), "In custom JSON provider");
//get the Object Mapper
ObjectMapper mapper = locateMapper(type, mediaType);
// Suppress null properties in JSON output
mapper.getSerializationConfig().setSerializationInclusion(org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion.NON_NULL);
// Set human readable date format
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
mapper.getSerializationConfig().setDateFormat(sdf);
super.writeTo(value, type, genericType, annotations, mediaType, httpHeaders, entityStream);
}
}
Поставщик для Джексона ObjectMapper
должен быть стандартным способом JAX-RS для этого (работает с Джерси), так что, похоже, также стоит использовать RESTeasy.