Как применять @JsonView только для потомков объекта с помощью Spring RestController - сериализация? - PullRequest
0 голосов
/ 02 мая 2020

У меня есть этот случай:

public class Project{

    private long id;

    private List<User> users;

    // other properties and getter setter etc
}

public class User{

   @JsonView(MinimalUser.class) 
   private long id;

   @JsonView(MinimalUser.class)
   private String name;

   private ComplexObject anything;

}

Теперь The RestMethod:


    @JsonView(MinimalUser.class)
    @GetMapping("/client/{id}")
    public List<Project> findProjectsByClientId(@PathVariable long id) {
        return projectService.findProjectsByClientId(id);
    }

Здесь я просто хочу инициализировать проект с минимальными объектами Users, но ничего не будет инициализировано, так как в моем проекте нет JsonView "MinimalUser.class", поэтому он не инициализирован.

Я не хочу помещать аннотацию @JsonView для всех моих переменных в проекте, потому что это было бы излишним ,

Как я могу сказать контроллеру только применять @ JsonView-фильтрацию / сериализацию к пользователю (дочернему элементу) проекта?

Поскольку этот вызов работает нормально (я получаю только обязательные поля):


    @JsonView(MinimalUser.class)
    @GetMapping("/minimal")
    public List<User> findAllUsers() {
        return userService.findAllUsers();
    }

1 Ответ

1 голос
/ 03 мая 2020

Если вы расширяете MinimalUser представление и применяете это новое представление ко всему проекту, вы можете получить следующие результаты:

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));

output :

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"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...