lor*_*tol 9 java spring json jackson jackson-modules
我有一个实体:
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column
private String title;
@OneToMany(fetch = FetchType.LAZY, mappedBy = ("movie"),cascade = CascadeType.ALL)
private List<Genre> genre;
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个控制器,其目的是检索书籍,我的问题是,类型字段被包含在我的控制器的json响应中.任何方式我可以排除那些杰克逊序列化对象时延迟加载的字段?
这是我的ObjectMapper的配置:
Hibernate4Module hm = new Hibernate4Module();
hm.configure(Hibernate4Module.Feature.FORCE_LAZY_LOADING, false);
registerModule(hm);
configure(SerializationFeature.INDENT_OUTPUT, true);
Run Code Online (Sandbox Code Playgroud)
谢谢!
我无法将其标记为JsonIgnore,因为它将永远不在序列化框中.有时候我需要随书检索这些类型,然后我会在查询中使用"fetch join",这样它就不会为空.
小智 12
您可以使用Jackson @JsonInclude注释执行此操作.
根据最新版本的javadoc(现在为2.4),如果字段值为null或为空,则可以使用简单注释指定是否包含带注释的属性.
默认情况下,它就是JsonInclude.Include.ALWAYS,这意味着即使您的懒惰未加载值为null,Jackson也会包含该属性.
指定不包含空值或空值可以显着减小JSON响应的大小,包括所有好处..
如果要更改此行为,可以在类级别或单个属性/ getterMethod级别添加注释.
如果为空,请尝试将以下注释添加到您不想包含的字段中:
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@OneToMany(fetch = FetchType.LAZY, mappedBy = ("movie"),cascade = CascadeType.ALL)
private List<Genre> genre;
Run Code Online (Sandbox Code Playgroud)
小智 6
您可以使用 spring 配置来默认禁用强制延迟加载!
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
Hibernate5Module hibernate5Module = new Hibernate5Module();
hibernate5Module.configure(Feature.FORCE_LAZY_LOADING, false);
// Enable below line to switch lazy loaded json from null to a blank object!
//hibernate5Module.configure(Feature.SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS, true);
mapper.registerModule(hibernate5Module);
return mapper;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22517 次 |
| 最近记录: |