관리 메뉴

HeBhy, since 1983.

@RestController에서 @JsonView가 없는 Mapping에 자동으로 @JsonView(default class)를 적용하고 싶을 경우 (Applying default '@JsonView' in rest controller which is not presented @JsonView annotation) 본문

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

 

이제 잘 작동될겁니다~

Comments