Jersey 在序列化期间省略了 XmlTransient 注释
Jersey omits XmlTransient annotation during serialization
要求将 java.util.Date
格式化为字符串而不是 json 中的时间戳。
{
"partyName": "Lifecare Pharmaceuticals",
"partyShortName": null,
"lastUpdateDate": 1486639814590, // replace with dd-mm-yyyy hh:mm:ss
}
为了实现日期格式,我添加了以下 ObjectMapperProvider
@Provider
@Component
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
@Override
public ObjectMapper getContext(Class<?> type) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(SerializationConfig.Feature.USE_ANNOTATIONS);
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
return objectMapper;
}
}
上述解决方案有效,但会产生另一个忽略 XmlTransient 注释的问题。在模型 类 中,Party
具有 PartyContacts
和 PartyContact
的集合映射为
@Column(name = "PARTY_ID", referencedColumnName = "PARTY_ID", insertable = false, updatable = false)
@ManyToOne(cascade = CascadeType.ALL, optional = false, fetch =FetchType.LAZY)
private Party party;
和getter方法
@XmlTransient
public Party getParty() {
return party;
}
此处 XmlTransient 注释不起作用,因此 json 递归加载。我已经看到了一个 @JsonIgnore 注释,但无法使其与 XmlTransient 一起使用。
在 Jackson 2.x 中可以通过适当的 AnnotationIntrospector
来实现。
同时支持 Jackson 和 JAXB 注释
要同时支持 Jackson 和 JAXB 注释,您需要 JacksonAnnotationIntrospector
and a JaxbAnnotationIntrospector
. Both introspectors can be combined with an AnnotationIntrospectorPair
:
AnnotationIntrospector primary = new JacksonAnnotationIntrospector();
AnnotationIntrospector secondary = new JaxbAnnotationIntrospector();
AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary);
mapper.setAnnotationIntrospector(pair);
仅支持 JAXB 注释
如果只想支持 JAXB 注释,只注册 JaxbAnnotationIntrospector
:
AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
mapper.setAnnotationIntrospector(introspector);
依赖关系
要使用 JaxbAnnotationIntrospector
,需要以下依赖项:
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>2.8.6</version>
</dependency>
有关详细信息,请查看 jackson-module-jaxb-annotations
module documentation。
要求将 java.util.Date
格式化为字符串而不是 json 中的时间戳。
{
"partyName": "Lifecare Pharmaceuticals",
"partyShortName": null,
"lastUpdateDate": 1486639814590, // replace with dd-mm-yyyy hh:mm:ss
}
为了实现日期格式,我添加了以下 ObjectMapperProvider
@Provider
@Component
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
@Override
public ObjectMapper getContext(Class<?> type) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(SerializationConfig.Feature.USE_ANNOTATIONS);
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
return objectMapper;
}
}
上述解决方案有效,但会产生另一个忽略 XmlTransient 注释的问题。在模型 类 中,Party
具有 PartyContacts
和 PartyContact
的集合映射为
@Column(name = "PARTY_ID", referencedColumnName = "PARTY_ID", insertable = false, updatable = false)
@ManyToOne(cascade = CascadeType.ALL, optional = false, fetch =FetchType.LAZY)
private Party party;
和getter方法
@XmlTransient
public Party getParty() {
return party;
}
此处 XmlTransient 注释不起作用,因此 json 递归加载。我已经看到了一个 @JsonIgnore 注释,但无法使其与 XmlTransient 一起使用。
在 Jackson 2.x 中可以通过适当的 AnnotationIntrospector
来实现。
同时支持 Jackson 和 JAXB 注释
要同时支持 Jackson 和 JAXB 注释,您需要 JacksonAnnotationIntrospector
and a JaxbAnnotationIntrospector
. Both introspectors can be combined with an AnnotationIntrospectorPair
:
AnnotationIntrospector primary = new JacksonAnnotationIntrospector();
AnnotationIntrospector secondary = new JaxbAnnotationIntrospector();
AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary);
mapper.setAnnotationIntrospector(pair);
仅支持 JAXB 注释
如果只想支持 JAXB 注释,只注册 JaxbAnnotationIntrospector
:
AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
mapper.setAnnotationIntrospector(introspector);
依赖关系
要使用 JaxbAnnotationIntrospector
,需要以下依赖项:
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>2.8.6</version>
</dependency>
有关详细信息,请查看 jackson-module-jaxb-annotations
module documentation。