파란하늘의 지식창고
반응형

objectMapper를 사용하면 보통 다음처럼 @JsonIgnore 처리를 하여 response 값에서 제외 처리를 하게 된다.

public class SomeDomain {

    private int someFieldA;
    
    @JsonIgnore
    private int someFieldB;
    
    @JsonIgnore
    private String someFieldC;

}

전체 공통으로 @JsonIgnore를 사용하지 않고  새로 추가하는 요청에 대해 특정 필드를 숨기고 싶은 경우가 있다.

simpleModule로 deserializer를 등록하는 건 전체 공통 적용인 것 같고 @JsonView를 @ResponseBody에 사용하려면 기존에 사용하던 전 구간에 @JsonView를 지정해야 하는 문제가 있다. (exclude 기능을 하는 json view annotation을 찾지 못하였다..)

@JsonFilter의 사용도 비슷한 이유로 쓰기 애매했다.

결국 아래처럼 사용하였다.

@Controller
@RequestMapping(/** mapping 설정 **/)
public class SomeController {

    @Autowired
    private Jackson2ObjectMapperBuilder builder;

    private ObjectMapper objectMapper;

    public void postConstruct() {
        objectMapper = builder.createXmlMapper(false).build();
        objectMapper.addMixIn(SomeDomain.class, SomeDomainMixIn.class);
    }

    @JsonIgnoreProperties({ "someFieldB", "someFieldC" })
    class SomeDomainMixIn {}

    @GetMapping("/someRequest")
    public String someRequest() {
        var someDomain = // someDomain 획득
        return objectMapper.writeValueAsString(someDomain);
    }
}

objectMapper를 따로 사용하고 응답을 String으로 반환하면서 mixin으로 제외할 필드를 지정하였다.

응답을 String으로 바꿔서 사용하고 objectMapper를 따로 지정하는 게 그리 좋은 방법 같지 않은데 더 나은 방법을 찾지 못하였다.

 
반응형
profile

파란하늘의 지식창고

@Bluesky_

도움이 되었다면 광고를 클릭해주세요