비슷한 문제가 있었지만 Hibernate의 양방향 관계와 관련이 있습니다. 나는 어떤 관점을 다루고 있는지에 따라 관계의 한쪽을 보여주고 다른 쪽은 프로그래밍 방식으로 무시하고 싶었습니다. 그렇게 할 수 없다면 불쾌한 StackOverflowException
s로 끝납니다 . 예를 들어, 이런 물건이 있다면
public class A{
Long id;
String name;
List<B> children;
}
public class B{
Long id;
A parent;
}
parent
A를보고 있으면 B 의 필드 를 프로그래밍 방식으로 무시하고 B를보고 있으면 A의 children
필드를 무시하고 싶습니다.
나는 이것을하기 위해 믹스 인을 사용하기 시작했지만 그것은 매우 빨리 끔찍 해졌다. 데이터 형식을 지정하기 위해 존재하는 쓸모없는 클래스가 너무 많습니다. 나는 이것을 더 깔끔한 방식으로 처리하기 위해 내 자신의 직렬 변환기를 작성했다 : https://github.com/monitorjbl/json-view .
무시할 필드를 프로그래밍 방식으로 지정할 수 있습니다.
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(JsonView.class, new JsonViewSerializer());
mapper.registerModule(module);
List<A> list = getListOfA();
String json = mapper.writeValueAsString(JsonView.with(list)
.onClass(B.class, match()
.exclude("parent")));
또한 와일드 카드 매처를 통해 매우 단순화 된보기를 쉽게 지정할 수 있습니다.
String json = mapper.writeValueAsString(JsonView.with(list)
.onClass(A.class, match()
.exclude("*")
.include("id", "name")));
제 원래의 경우 이와 같은 단순한보기의 필요성은 부모 / 자식에 대한 최소한의 정보를 표시하는 것이었지만 역할 기반 보안에도 유용했습니다. 개체에 대한 더 적은 정보를 반환하는 데 필요한 권한이 낮은 개체보기
이 모든 것은 serializer에서 나왔지만 내 앱에서 Spring MVC를 사용하고있었습니다. 이러한 경우를 제대로 처리하기 위해 기존 Spring 컨트롤러 클래스에 드롭 할 수있는 통합을 작성했습니다.
@Controller
public class JsonController {
private JsonResult json = JsonResult.instance();
@Autowired
private TestObjectService service;
@RequestMapping(method = RequestMethod.GET, value = "/bean")
@ResponseBody
public List<TestObject> getTestObject() {
List<TestObject> list = service.list();
return json.use(JsonView.with(list)
.onClass(TestObject.class, Match.match()
.exclude("int1")
.include("ignoredDirect")))
.returnValue();
}
}
둘 다 Maven Central에서 사용할 수 있습니다. 나는 그것이 다른 누군가에게 도움이되기를 바랍니다. 이것은 내 사건에 대한 좋은 해결책이 없었던 Jackson의 특히 추악한 문제입니다.