pooney
article thumbnail
Published 2020. 7. 5. 19:08
Spring boot @JsonFilter Spring boot

사용자에 따른 json 형태로 데이터를  보내고자 할때 보내지 않아도 되는 데이터는 필터링하여 보내고 싶은 경우가 있다. 이떄 사용하는 것이 @JsonFilter 이다 

 

 

 

User

    package com.ex.boot.web;

    import com.fasterxml.jackson.annotation.JsonFilter;
    import lombok.AllArgsConstructor;

    import lombok.Data;
    import lombok.NoArgsConstructor;


    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;


    @Data
    @NoArgsConstructor
    @AllArgsConstructor

    @JsonFilter("UserFilter")
    public class User {
        @Size(min=2)
        private String uid;
        private String password;

    }

@JSONFilter를 통해 UserFilter라는 id를 정의합니다. 후에 Fiter를 등록할 때 해당 아이디 값으로 참조하여 사용되어집니니다.  

 

 

TestController

package com.ex.boot.web;

import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;

import org.springframework.http.converter.json.MappingJacksonValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;


import javax.validation.Valid;
import java.util.HashMap;
import java.util.Map;


@RestController
public class TestController {



    @GetMapping("/user")
    public  MappingJacksonValue user(@RequestBody User user){

        SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.filterOutAllExcept("uid");

        FilterProvider filters = new SimpleFilterProvider().addFilter("UserFilter",filter);

        MappingJacksonValue mapping = new MappingJacksonValue(user);

        mapping.setFilters(filters);

        return mapping;
     }

    @PostMapping("/user")
    public void insertUser(@Valid @RequestBody User user){
        System.out.println(user);
    }





}

Bean Property를 제어 하기위해서  SimpleBeanPropertyFilter를 사용하겠습니다. 

 

SimpleBeanPropertyFilter.filterOutAllExcept 를 통해 내가 사용자에게 보내고자 하는 필드를 정의합니다. 

 

SimpleBeanPropertyFilter를 우리가 사용 할 수 있게  FilterProvider를 사용합니다.  Filter를 추가할때 

SimpleFilterProvider().addFilter를 사용하는데 해당 필터가 어떠한 bean을 대상으로 사용되어지는 필터인지 정의를 해야합니다. 때문에 User클래스에서 @JsonFilter를 통하여 id를 UserFilter라고 정의해논것을 사용하 겠습니다. 이후 Mapping 데이터에 filter를 추가합니다. 

 

결과

 

 

요청한 결과 uid 값만 사용자에게 노출되는 것을 확인 할 수 있습니다. 

profile

pooney

@pooney

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!