Dev/Web
@RestController에서 @JsonView가 없는 Mapping에 자동으로 @JsonView(default class)를 적용하고 싶을 경우 (Applying default '@JsonView' in rest controller which is not presented @JsonView annotation)
HeBhy
2020. 7. 22. 14:01
jackson annotation에서 @JsonView를 적용하여 같은 Entity 에 대해 RestController mapping별로 다른 출력을 원할 경우, @RequestMapping(@GetMapping 등 동일..) 에 @JsonView를 붙이지 않으면 Entity에 선언한 @JsonView가 무효화 될 경우가 있습니다.
예를 들어, car entity안의 number라는 값에
@JsonView(JsonViewVisibility.ViewAll.class)
private String number;
처럼 적용했는데, 그대로 json string이 출력됩니다.
그렇다고 일일이 @RequestMapping에 @JsonView(default class)를 붙일수는 없겠죠..
그래서 @JsonView가 선언되지 않은 경우 기본 클래스(여기선 JsonViewVisibility.Anonymous.class라고 가정)를 붙여주기 위해 아래 파일을 만들어줍니다.
package com.example.rest;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJacksonValue;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.AbstractMappingJacksonResponseBodyAdvice;
@RestControllerAdvice
public class SecurityJsonViewControllerAdvice extends AbstractMappingJacksonResponseBodyAdvice {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return super.supports(returnType, converterType);
}
@Override
protected void beforeBodyWriteInternal(MappingJacksonValue bodyContainer, MediaType contentType,
MethodParameter returnType, ServerHttpRequest request, ServerHttpResponse response) {
Class<?> defaultViewClass= JsonViewVisibility.Anonymous.class; // 기본값
if(bodyContainer.getSerializationView() == null) { bodyContainer.setSerializationView(defaultViewClass); }
}
}
이제 잘 작동될겁니다~