Java 如何仅将@JsonView应用于具有SpringRestController序列化的对象的子对象?
我有这个案子:Java 如何仅将@JsonView应用于具有SpringRestController序列化的对象的子对象?,java,spring,serialization,jackson,json-view,Java,Spring,Serialization,Jackson,Json View,我有这个案子: 公共类项目{ 私人长id; 私人名单用户; //其他属性和getter setter等 } 公共类用户{ @JsonView(MinimalUser.class) 私人长id; @JsonView(MinimalUser.class) 私有字符串名称; 私有复杂对象任何东西; } 现在使用rest方法: @JsonView(MinimalUser.class) @GetMapping(“/client/{id}”) 公共列表FindProjectsByClient id(@P
公共类项目{
私人长id;
私人名单用户;
//其他属性和getter setter等
}
公共类用户{
@JsonView(MinimalUser.class)
私人长id;
@JsonView(MinimalUser.class)
私有字符串名称;
私有复杂对象任何东西;
}
现在使用rest方法:
@JsonView(MinimalUser.class)
@GetMapping(“/client/{id}”)
公共列表FindProjectsByClient id(@PathVariable long id){
return projectService.findProjectsByClientId(id);
}
在这里,我只想用最少的Users对象初始化一个项目,但不会初始化任何东西,因为我的项目中并没有“MinimalUser.class”JsonView,所以它并没有初始化
我不想将@JsonView注释放在项目中的所有变量上,因为这样做太过分了
我如何告诉控制器仅将@JsonView筛选/序列化应用于项目的用户(子项)
因为这个调用可以正常工作(我只得到必需的字段):
@JsonView(MinimalUser.class)
@GetMapping(“/minimal”)
公共列表findAllUsers(){
返回userService.findAllUsers();
}
如果扩展minimauser
视图并将此新视图应用于整个项目,则可以获得以下结果:
public class MinimalProject extends MinimalUser {}
public class DetailedProject extends MinimalProject {}
// apply view to entire class
@JsonView(MinimalProject.class)
public class Project {
// keep existing fields as is
// limit view for project
@JsonView(DetailedProject.class)
private String details;
}
// test
ObjectMapper mapper = new ObjectMapper().disable(MapperFeature.DEFAULT_VIEW_INCLUSION);
User u = new User();
u.setId(1);
u.setName("John Doe");
u.setEmail("john@doe.com");
u.setDetails("some details");
System.out.println("user default view: " + mapper.writeValueAsString(u));
System.out.println("user minimal view: " + mapper.writerWithView(MinimalUser.class).writeValueAsString(u));
Project p = new Project();
p.setId(1000);
p.setName("MegaProject");
p.setUsers(Arrays.asList(u));
p.setDetails("Project details: worth $1M");
System.out.println("project default view: " + mapper.writeValueAsString(p));
System.out.println("project minimal view: " + mapper.writerWithView(MinimalProject.class).writeValueAsString(p));
输出:
这正是我想要的。非常感谢。
user default view: {"id":1,"name":"John Doe","details":"some details","email":"john@doe.com"}
user minimal view: {"id":1,"name":"John Doe"}
project default view: {"id":1000,"users":[{"id":1,"name":"John Doe","details":"some details","email":"john@doe.com"}],"name":"MegaProject","details":"Project details: worth $1M"}
project minimal view: {"id":1000,"users":[{"id":1,"name":"John Doe"}],"name":"MegaProject"}