我正在使用Jersey 2.22.1和Jackson 2.6.3编写Web应用程序。我的pom.xml看起来像这样:
<!-- JERSEY -->
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.22.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.22.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.22.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>2.22.1</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
<version>4.4.1</version>
</dependency>
<!-- JACKSON -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.6.3</version>
</dependency>
目标是将不同的自定义ObjectMappers用于JSON和XML映射。我创建了两个提供程序类:JSONMapperProvider
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JSONMapperProvider implements ContextResolver<ObjectMapper> {
private static ObjectMapper objectMapper;
public JSONMapperProvider() {
init();
}
public static void init() {
if (objectMapper == null) {
objectMapper = new ObjectMapper();
// SERIALIZATION
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true)
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, false)
.setSerializationInclusion(Include.NON_NULL)
.setSerializationInclusion(Include.NON_EMPTY);
// DESERIALIZATION
objectMapper.configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true)
.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
// set up ISO 8601 date/time stamp format:
ObjectMapperProvider.DATE_FORMAT_ISO8601.setTimeZone(TimeZone.getTimeZone("GMT"));
objectMapper.setDateFormat(ObjectMapperProvider.DATE_FORMAT_ISO8601);
// Custom deserializer for date which helps deserialization of date
// without time
SimpleModule dateDeserializerModule = new SimpleModule("DateDeserializerModule", Version.unknownVersion());
dateDeserializerModule.addDeserializer(Date.class, new CustomJsonDateDeserializer());
//objectMapper.registerModule(dateDeserializerModule);
}
}
@Override
public ObjectMapper getContext(Class<?> type) {
System.out.println("JSONMapperProvider.getContext() called with type: "
+ type);
return objectMapper;
}
private static class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException, JsonProcessingException {
String date = jsonparser.getText();
try {
return DateUtil.parseDate(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
}
和XMLMapperProvider
@Provider
@Produces({ MediaType.APPLICATION_XML })
public class XMLMapperProvider implements ContextResolver<ObjectMapper> {
private static ObjectMapper objectMapper;
public XMLMapperProvider() {
init();
}
public static void init() {
if (objectMapper == null) {
JacksonXmlModule module = new JacksonXmlModule();
module.setDefaultUseWrapper(false);
objectMapper = new XmlMapper(module);
// SERIALIZATION
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true)
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, false)
.setSerializationInclusion(Include.NON_NULL)
.setSerializationInclusion(Include.NON_EMPTY);
// DESERIALIZATION
objectMapper.configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true)
.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
// set up ISO 8601 date/time stamp format:
ObjectMapperProvider.DATE_FORMAT_ISO8601.setTimeZone(TimeZone.getTimeZone("GMT"));
objectMapper.setDateFormat(ObjectMapperProvider.DATE_FORMAT_ISO8601);
// Custom deserializer for date which helps deserialization of date
// without time
SimpleModule dateDeserializerModule = new SimpleModule("DateDeserializerModule", Version.unknownVersion());
dateDeserializerModule.addDeserializer(Date.class, new CustomJsonDateDeserializer());
objectMapper.registerModule(dateDeserializerModule);
}
}
@Override
public ObjectMapper getContext(Class<?> type) {
System.out.println("XMLMapperProvider.getContext() called with type: "
+ type);
return objectMapper;
}
private static class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException, JsonProcessingException {
String date = jsonparser.getText();
try {
return DateUtil.parseDate(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
}
它们都在同一包中,并在Application资源类中注册
@ApplicationPath("resources")
public class CCRestResources extends ResourceConfig {
public CCRestResources() {
register(JacksonFeature.class);
packages("com.cc.rest.jersey");
}
}
如果我向@Produces(MediaType.APPLICATION_JSON)的方法发出GET请求,则一切正常,并使用了我的自定义映射器。但是,如果我提出相同的要求,请@Produces(MediaType.APPLICATION_XML)应用程序使用某些默认映射器,而不是我的自定义映射器。如果您有任何想法请帮助。谢谢!
有几件事。首先,您不仅需要核心Jackson
xml依赖项,还需要实际的jaxrs提供程序
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-xml-provider</artifactId>
<version>${jackson2.version}</version>
</dependency>
然后,您应该排除JAXB提供程序,这是Jersey所使用的默认提供程序。(我在测试时保留它没有问题,但是如果您不打算使用它,我将排除它)。它是由jersey- server
插入的,因此您应明确声明jersey-server
并jersey-media-jaxb
从中排除
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey2.version}</version>
<exclusions>
<exclusion>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-jaxb</artifactId>
</exclusion>
</exclusions>
</dependency>
然后,您将需要注册JacksonJaxbXMLProvider
(或JacksonXMLProvider
不需要或计划使用JAXB批注的)。
public CCRestResources() {
register(JacksonFeature.class);
register(JacksonJaxbXMLProvider.class);
packages("com.cc.rest.jersey");
}
最后,您需要将参数ContextResolver
化为XmlMapper
类型,而不是ObjectMapper
。可以看出这里的供应商寻找一ContextResolver
对XmlMapper
,没有ObjectMapper
。
问题内容: 我需要设置班级日期序列化的格式。我有Jackson的版本,没有@JsonFormat。这就是为什么我编写自定义类的原因: } 并使用它: 但是,我还有另一个具有不同日期格式的字段,并且我不想创建用于序列化的其他类。我可以将所有需要的格式(例如常量)添加到CDJsonDateSerializer类中,并通过注释设置所需的格式吗?像这样: 。 下面的答案后: 经过一些更正后,它可以工作。我
我想使用Spring的RestTemplate plus Jackson来使用Web服务。我已经学习了几本教程,并且已经达到了创建DAO的目的。这是我获取所有域对象的方法: 但我的Web服务不会立即返回Station对象数组,而是以这种方式返回一个更具语义的表达式: 所以我的问题是,我不知道如何“告诉”RestTemplate在“stations”指示符之后立即解析对象列表,而不创建临时对象,这似
我在spring-boot项目中使用Jackson和hibernate: 并将其添加到转换器中: 我使用facebook网络钩子在Messenger中重新获取关于新消息的信息: 有效负载参数是一个字符串,但jackson转换器无法对其进行反序列化: W.S.M.S.DefaultHandlerExceptionResolver:未能读取HTTP消息:org.springframework.HTTP
我正在尝试使用杰克逊在json和java对象之间轻松转换。所以我在我的项目中导入了三个罐子 杰克逊注释,杰克逊数据绑定和杰克逊核心。但是,当我在类中编写对象映射器时,它仍然无法识别它。 人员 ob = 新的对象映射器().readValue(内容,人员.class);在这里,对象映射器始终带有红色下划线。我试图手动导入一些东西,仍然什么都没有。
问题内容: 我想要的是对类的对象有条件地使用默认BeanSerializer: 我试图做这样的事情: 但这调用了MyCustomSerializer的方法,而且我永无止境地递归。如何获得可以用于普通bean序列化的适当的Serializer对象? 问题答案: 这需要更复杂的设置:您需要让Jackson创建一个,然后接管,而不是直接覆盖要使用的序列化器。这可以通过注册(via )方法来完成。将为您提
我写Web应用程序使用泽西2.22.1和杰克逊2.6.3。我的pom.xml是这样的: 目标是为JSON和XML映射使用不同的自定义ObjectMapper。我创建了两个提供程序类:JSONMapperProvider 和XMLMapperProvider 它们都在同一个包中,该包在应用程序资源类中注册 若我向@products(MediaType.APPLICATION_JSON)的方法发出GE