2016-06-29 2 views
1

저지에서 ContextResolver은 무엇이며 Provider은 무엇인가요? 둘의 차이점은 무엇입니까? 저지와 함께 겐슨을 사용하고 있습니다. Gersey은 Jersey가 클래스 패스에서 Genson JAR을 발견하면 자동 등록됩니다. Genson JAR의 WEB-INF/services 디렉토리에는 "org.glassfish.jersey.internal.spi.AutoDiscoverable"이라는 파일이 있습니다. 더 혼란 놀이로 오는 곳저지의 ContextResolver 및 Provider는 무엇입니까?

@Provider 
@Consumes({MediaType.APPLICATION_JSON, "text/json", "application/*+json"}) 
@Produces({MediaType.APPLICATION_JSON, "text/json", "application/*+json"}) 
public class GensonJsonConverter implements MessageBodyReader<Object>, MessageBodyWriter<Object> { 

    private final ContextResolver<GensonJaxRSFeature> _gensonResolver; 

은 다음과 같습니다 :

AutoDiscoverable 경로는 기본적으로 Genson/뉴저지가에게 다음과 같은 클래스를 자동 등록하는 다음이 같은 사용자 지정 공급자를 만들 권장 Genson 문서보고 그래서 :

@Provider 
    public class GensonProvider implements ContextResolver<Genson> { 
    private final Genson genson = new GensonBuilder().setSkipNull(true).create(); 
    } 

그러나 그 공급자는 내부 Genson 하나 같은 ContextResolver 아닌 MessageBodyReader/라이터가하는 구현한다. 차이점이 뭐야? 또한 해당 공급자는 을 수행하지 않습니다. 기본 자동 등록 된 것과 동일한 작업을 수행합니다! 특히 은 과 같은 JAXB 태그를 무시합니다! GensonJaxRSFeature에 대한 Genson 소스 코드에 파고, 나는 Genson 개체과 같이 만들어 볼 : 그에서 내가 볼 수있는 Genson 문서에서

private static final Genson _defaultGenson = new GensonBuilder() 
     .withBundle(new JAXBBundle()) 
     .useConstructorWithArguments(true) 
     .create(); 

은 "JAXBBundle는"관심을 지불 할 Genson 원인이 아마도 무엇이라고 JAXB 주석에.

주요 문제 :

나는 뉴저지에 자동으로 등록 된 기본 Genson JSON 제공자를 사용하려면,하지만 난 거기에 몇 가지 사용자 지정 속성을 설정합니다. 제가 말했듯이, 제가 커스텀 제공자를 등록 할 때, 디폴트 Genson을 사용하지 않습니다!


업데이트 :

이 내가 지금 뭘하는지이며 작동합니다. 그러나 아래의 @eugen 솔루션은 Genson 권장 솔루션입니다.

@Provider 
public class GensonProvider implements ContextResolver<GensonJaxRSFeature> { 
    private final GensonJaxRSFeature _gensonResolver = new GensonJaxRSFeature(); 

    private static final Genson _defaultGenson = new GensonBuilder() 
       .withBundle(new JAXBBundle()) 
       .useConstructorWithArguments(true) 
       .setSkipNull(true) 
       .create(); 

    @Override 
    public GensonJaxRSFeature getContext(Class<?> type) { 
     return _gensonResolver.use(_defaultGenson); 
    } 
} 
+0

Genson이 사용자 지정 공급자를 정의 할 것을 권장한다고 어떻게합니까? 적어도 현재 문서에서는 사용자 정의 Genson 인스턴스를 사용하는 GensonJaxRSFeature로 구성된 ResourceConfig를 사용하도록 권장합니다. 기본 genson 인스턴스를 변경하지 않아도됩니다. 다른 설정을 원하면 원하는 설정으로 다른 인스턴스를 만드십시오. – eugen

+0

@eugen 내 편집을보고 내가 한 일을 확인하십시오. Genson 문서에서 권장되는 코드는 "새로운 ResourceConfig(). register (new GensonJaxRSFeature(). use (myCustomGenson) .disableSerializationFor (String.class));"입니다. 그것은 당신이 보통 "새로운 ResourceConfig"코드를 넣는 대신에 Provider를 사용하는 것 외에는 지금하고있는 것과 똑같습니다. "새로운 ResourceConfig"는 일반적으로 어디에 있습니까?예제 또는 링크를 게시 할 수 있습니까? – KyleM

+0

ResourceConfig 사용 방법에 대한 [공식 문서] (https://jersey.java.net/documentation/latest/deployment.html#environmenmt.appmodel)를 확인하십시오. 기본 genson 인스턴스를 가져 와서 수정하는 방법은 없습니다. 원하는 설정을 직접 제공하십시오. Genson이 JAXB 주석을 사용하여이 번들을 사용하도록 구성하려면 예를 선택하십시오. – eugen

답변

2

같은 문제에 대한 우리의 세계와 마찬가지로 여러 가지 해결책이 있습니다. 저지는 사용자 지정 공급자를 정의하는 대신 ResourceConfig를 사용하도록 권장합니다. 따라서 리소스 설정 (저지 문서 here 및 Genson 설명서 here)을 사용하여 달성 할 수 있습니다.

public class MyApplication extends ResourceConfig { 
    public MyApplication() { 
     Genson genson = new GensonBuilder() 
       .withBundle(new JAXBBundle()) 
       .useConstructorWithArguments(true) 
       .setSkipNull(true) 
       .create(); 

     register(new GensonJaxRSFeature().use(genson)); 
    } 
} 

물론 제공자와 함께하는 방법도 좋습니다.

+0

고마워, 나는 단지이 솔루션의 경우가 아닌 "새로운 ResourceConfig()"를 작성하라고 말하는 Genson 문서에서 b/c를 혼란스럽게 생각한다고 생각한다. 새로운 GensonBuilder를 만들었지 만 결코 새로운 ResourceConfig()를 만들지는 않습니다. 어쨌든, 이제 알았습니다. "새로운 ResourceConfig"조각으로 중요한 것을 놓치지 않았 음을 대부분 확신하고있었습니다 ... – KyleM

+0

아니요, 놓치지 마세요. 자원 구성은 저지가 구성 부분을 넣기를 원한다는 것 같습니다. 그러나 현재의 솔루션도 좋습니다. 예, 여기서는 리소스 구성을 만들지 않고 확장합니다. 저지의 다른 용도에서 사람들은 그것을 인스턴스화 할 것입니다 (저는 그것이 부두 + 저지와 같은 경우라고 생각합니다). – eugen