Spring boot
Spring boot @JsonFilter
pooney
2020. 7. 5. 19:08
사용자에 따른 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 값만 사용자에게 노출되는 것을 확인 할 수 있습니다.