Loading...
Spring Framework Reference Documentation 7.0.2의 Jackson JSON의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Spring은 Jackson JSON 라이브러리에 대한 지원을 제공합니다.
Spring MVC는
Jackson’s Serialization Views에 대한 내장 지원을 제공하며,
이를 통해 Object의 모든 필드 중 일부만 렌더링할 수 있습니다.
@ResponseBody 또는 ResponseEntity 컨트롤러 메서드와 함께 사용하려면,
다음 예제에서 보이는 것처럼 serialization view 클래스를 활성화하기 위해 Jackson의
@JsonView 어노테이션을 사용할 수 있습니다:
1@RestController 2public class UserController { 3 4 @GetMapping("/user") 5 @JsonView(User.WithoutPasswordView.class) 6 public User getUser() { 7 return new User("eric", "7!jd#h23"); 8 } 9} 10 11public class User { 12 13 public interface WithoutPasswordView {}; 14 public interface WithPasswordView extends WithoutPasswordView {}; 15 16 private String username; 17 private String password; 18 19 public User() { 20 } 21 22 public User(String username, String password) { 23 this.username = username; 24 this.password = password; 25 } 26 27 @JsonView(WithoutPasswordView.class) 28 public String getUsername() { 29 return this.username; 30 } 31 32 @JsonView(WithPasswordView.class) 33 public String getPassword() { 34 return this.password; 35 } 36}
1@RestController 2class UserController { 3 4 @GetMapping("/user") 5 @JsonView(User.WithoutPasswordView::class) 6 fun getUser() = User("eric", "7!jd#h23") 7} 8 9class User( 10 @JsonView(WithoutPasswordView::class) val username: String, 11 @JsonView(WithPasswordView::class) val password: String) { 12 13 interface WithoutPasswordView 14 interface WithPasswordView : WithoutPasswordView 15}
@JsonView는 view 클래스의 배열을 허용하지만, 컨트롤러 메서드마다 하나만 지정할 수 있습니다.<br>여러 view를 활성화해야 하는 경우 composite 인터페이스를 사용할 수 있습니다.
위 작업을 어노테이션 @JsonView를 선언하는 대신 프로그래밍 방식으로 수행하려면,
반환 값을 MappingJacksonValue로 감싸고 serialization view를 제공하는 데 사용하면 됩니다:
1@RestController 2public class UserController { 3 4 @GetMapping("/user") 5 public MappingJacksonValue getUser() { 6 User user = new User("eric", "7!jd#h23"); 7 MappingJacksonValue value = new MappingJacksonValue(user); 8 value.setSerializationView(User.WithoutPasswordView.class); 9 return value; 10 } 11}
1@RestController 2class UserController { 3 4 @GetMapping("/user") 5 fun getUser(): MappingJacksonValue { 6 val value = MappingJacksonValue(User("eric", "7!jd#h23")) 7 value.serializationView = User.WithoutPasswordView::class.java 8 return value 9 } 10}
view resolution에 의존하는 컨트롤러의 경우, 다음 예제에서 보이는 것처럼 serialization view 클래스를 모델에 추가할 수 있습니다:
1@Controller 2public class UserController extends AbstractController { 3 4 @GetMapping("/user") 5 public String getUser(Model model) { 6 model.addAttribute("user", new User("eric", "7!jd#h23")); 7 model.addAttribute(JsonView.class.getName(), User.WithoutPasswordView.class); 8 return "userView"; 9 } 10}
1@Controller 2class UserController : AbstractController() { 3 4 @GetMapping("/user") 5 fun getUser(model: Model): String { 6 model["user"] = User("eric", "7!jd#h23") 7 model[JsonView::class.qualifiedName] = User.WithoutPasswordView::class.java 8 return "userView" 9 } 10}
ResponseEntity
Model