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);

이 솔루션은 필자가 지정한 공급자 만 사용하면 원하는 결과를 얻을 수 있습니다. 동일한 결과를 얻는 더 정확한 방법이 있습니까?