Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何仅将@JsonView应用于具有SpringRestController序列化的对象的子对象?_Java_Spring_Serialization_Jackson_Json View - Fatal编程技术网

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"}