Jersey에 포함 된 공급자 재정의 [java]
Answers
Question
Jackson이 반환 한 JsonProcessingException을 처리하기 위해 Jersey에서 사용자 정의 ExceptionMapper를 작성해야합니다.
Jackson 라이브러리에는 이미이 예외에 대한 ExceptionMapper 공급자가 JsonMappingExceptionMapper.java 및 JsonParseExceptionMapper.java ( link ) 형식으로 포함되어 있습니다.
"my.package"에이 예외 매퍼에 대한 새 공급자를 추가하면 선택한 공급자와 관련하여 예기치 않은 결과가 발생합니다. 때로는 "my.package"에서 제공자를 선택하고 때로는 Jackson 라이브러리에서 제공자를 선택합니다. 패키지를 검사하는 데 사용하는 코드는 다음과 같습니다.
PackgesResourceConfig packagesResourceConfig = new PackgesResourceConfig("com.fasterxml.jackson.jaxrs", "my.package");
제안 된 해결책
현재 나는 Jackson 라이브러리에서 제공자를 수동으로 필터링하여이 문제를 해결하고 있습니다. 그러나 내가 정말로 알고 싶은 것은 이것을하기에 더 받아 들일 수 있고 지원되는 방법이 있는지 아닌지입니다.
먼저 PackagesResourceConfig를 확장합니다.
public class FilteredPackgesResourceConfig extends PackagesResourceConfig {
private Set<Class<?>> classesToFilter = new HashSet<Class<?>>();
public FilteredPackgesResourceConfig(String... packages) {
super(packages);
}
public FilteredPackgesResourceConfig(Map<String, Object> props) {
super(props);
}
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = super.getClasses();
if (classes != null && classesToFilter != null) {
classes.removeAll(classesToFilter);
}
return classes;
}
public Set<Class<?>> getClassesToFilter() {
return classesToFilter;
}
public void setClassesToFilter(Set<Class<?>> classesToFilter) {
this.classesToFilter = classesToFilter;
}
}
이 클래스를 사용하여 원하지 않는 특정 공급자를 필터링합니다.
FilteredPackgesResourceConfig packagesResourceConfig = new FilteredPackgesResourceConfig("com.fasterxml.jackson.jaxrs", "my.package");
classesToFilter.add(com.fasterxml.jackson.jaxrs.json.JsonMappingExceptionMapper.class);
classesToFilter.add(com.fasterxml.jackson.jaxrs.json.JsonParseExceptionMapper.class);
packagesResourceConfig.setClassesToFilter(classesToFilter);
이 솔루션은 필자가 지정한 공급자 만 사용하면 원하는 결과를 얻을 수 있습니다. 동일한 결과를 얻는 더 정확한 방법이 있습니까?