Мне удалось сделать это в Resteasy «способом JAX-RS», поэтому он должен работать на каждой совместимой реализации, например на Джерси (недавно успешно протестированной на сервере Wildfly 8 на JEE7, просто потребовалось несколько изменений в части Джексона, потому что они изменил несколько API).
Вы должны определить ContextResolver (проверьте, что Produces содержит правильный тип контента):
import javax.ws.rs.ext.ContextResolver;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.DeserializationConfig;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.Produces;
import java.text.SimpleDateFormat;
@Provider
@Produces("application/json")
public class JacksonConfigurator implements ContextResolver<ObjectMapper> {
private ObjectMapper mapper = new ObjectMapper();
public JacksonConfigurator() {
SerializationConfig serConfig = mapper.getSerializationConfig();
serConfig.setDateFormat(new SimpleDateFormat(<my format>));
DeserializationConfig deserializationConfig = mapper.getDeserializationConfig();
deserializationConfig.setDateFormat(new SimpleDateFormat(<my format>));
mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
}
@Override
public ObjectMapper getContext(Class<?> arg0) {
return mapper;
}
}
Затем вы должны вернуть только что созданный класс в ваш javax.ws.rs.core.Application в getClasses
import javax.ws.rs.core.Application;
public class RestApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
// your classes here
classes.add(JacksonConfigurator.class);
return classes;
}
}
таким образом, все операции, выполняемые через Джексона, получают ObjectMapper на ваш выбор.
РЕДАКТИРОВАТЬ: Я недавно узнал за свой счет, что при использовании RestEasy 2.0.1 (и, следовательно, Джексон 1.5.3) есть странное поведение, если вы решите расширить JacksonConfigurator для добавления пользовательских сопоставлений.
import javax.ws.rs.core.MediaType;
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class MyJacksonConfigurator extends JacksonConfigurator
Если вы просто делаете это (и, конечно, помещаете расширенный класс в RestApplication), используется преобразователь родительского класса, то есть вы теряете пользовательские сопоставления. Чтобы это работало правильно, я должен был сделать что-то, что мне кажется бесполезным:
public class MyJacksonConfigurator extends JacksonConfigurator implements ContextResolver<ObjectMapper>