Spring은 Jackson JSON 라이브러리를 지원합니다.
Spring MVC는 Object
에 있는 모든 필드의 하위 집합만 렌더링할 수 있는 Jackson의 직렬화 뷰에 대한 기본 지원을 제공합니다. @ResponseBody
또는 ResponseEntity
컨트롤러 메서드와 함께 사용하려면 다음 예제와 같이 Jackson의 @JsonView
annotation을 사용하여 직렬화 뷰 클래스를 활성화할 수 있습니다.
@RestController
public class UserController {
@GetMapping("/user")
@JsonView(User.WithoutPasswordView.class)
public User getUser() {
return new User("eric", "7!jd#h23");
}
}
public class User {
public interface WithoutPasswordView {};
public interface WithPasswordView extends WithoutPasswordView {};
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
@JsonView(WithoutPasswordView.class)
public String getUsername() {
return this.username;
}
@JsonView(WithPasswordView.class)
public String getPassword() {
return this.password;
}
}
[Note]
@JsonView
는 다양한 뷰 클래스를 허용하지만 컨트롤러 메서드당 하나만 지정할 수 있습니다. 여러 보기를 활성화해야 하는 경우 복합 인터페이스를 사용할 수 있습니다.
위 작업을 프로그래밍 방식으로 수행하려면 @JsonView
annotation을 선언하는 대신 반환 값을 MappingJacksonValue
로 래핑하고 이를 사용하여 직렬화 뷰를 제공합니다.
@RestController
public class UserController {
@GetMapping("/user")
public MappingJacksonValue getUser() {
User user = new User("eric", "7!jd#h23");
MappingJacksonValue value = new MappingJacksonValue(user);
value.setSerializationView(User.WithoutPasswordView.class);
return value;
}
}
뷰 확인에 의존하는 컨트롤러의 경우 다음 예제와 같이 직렬화 뷰 클래스를 모델에 추가할 수 있습니다.
@Controller
public class UserController extends AbstractController {
@GetMapping("/user")
public String getUser(Model model) {
model.addAttribute("user", new User("eric", "7!jd#h23"));
model.addAttribute(JsonView.class.getName(), User.WithoutPasswordView.class);
return "userView";
}
}