2011-10-07 2 views
5

우리는 JSR-330 기반 주입을 사용하여 독립 실행 형 Java 6 응용 프로그램을 구성하는 상황을 가지며 모든 계층에서 구성 매개 변수를 가져 오는 데 매우 적합합니다 .웹 컨테이너 외부의 Java 6에서 JAX-WS와 Guice 3 사용

우리는 웹 컨테이너 안에 Java 5가있는 독립 실행 형 Metro 배포를 사용하여 잠시 동안 JAX-WS 웹 서비스를 사용했지만 Java 6에서는 Endpoint 클래스를 사용하여 크기를 줄입니다. 내가 원하는대로 설정없이 서블릿 컨테이너 (부두, 톰캣)

  • Guice 3 인젝터 -

    그래서 지금은 내가

    • 독립형 자바 6 응용 프로그램이 상황이있다.
    • Endpoint@javax.jws.WebService 웹 서비스로 내 메서드를 노출 주석이 클래스를 처리.

    웹 서비스 메소드에서 @Inject 필드를 투명하게 처리하거나 인젝터에 액세스 할 수있게하고 싶습니다. 내가 주 방법에서 정적 필드로 잡아 수 있지만 청소기 솔루션을 싶습니다.

    제안 사항?

    (나는 http://jax-ws-commons.java.net/guice/ 모듈은 Guice 3 작동하지 않습니다 JAX-WS and Guice 3에서 이해하고 제안 된 해결 방법은 특정 톰캣입니다)

    JSR-250 @Resource 주석 여기에 도움이 될 것인가?

  • +0

    그것은 내가 할로 구현 객체에 공급자를 주입하여 내가 지금에 의해 얻을 수 있습니다 밝혀졌다 깊게 중첩 된 주입이 필요하지 않습니다. 바운티가이 사실을 깨닫게 해주는 대답을주었습니다. –

    답변

    5

    나는 모든 질문을 이해할 수 있을지 확신하지 못합니다. +500 현상금은 너무 쉽게 보입니다. 원하는 코드가 아닌 경우 일부 코드를 게시하십시오. 어쨌든

    , 의존성 주입과 웹 서비스를 생성하는 간단한 솔루션 : 클래스 패스 스캐닝 (Reflections)와보다 정교한 솔루션 아래

    final Module module = new HelloModule(); 
    final Injector injector = Guice.createInjector(module); 
    final HelloService helloService = injector.getInstance(HelloService.class); 
    
    Endpoint.publish("http://localhost:8080/helloService", helloService); 
    

    JAX-WS Guice integration에서 마커스 에릭손의 코드를 기반으로. 이라는 주석이 달린 모든 클래스를 웹 서비스로 게시합니다 (Endpoint.publish()).

    private void initGuicedWebservices(final String packageNamePrefix) 
         throws Exception { 
        final Reflections reflections = new Reflections(packageNamePrefix); 
        final Set<Class<?>> guiceManaged = 
         reflections.getTypesAnnotatedWith(GuiceManaged.class); 
        for (final Class<?> clazz : guiceManaged) { 
         doGuice(clazz); 
        } 
    } 
    
    private void doGuice(final Class<?> clazz) throws Exception { 
        final GuiceManaged guiceManagedAnnotation = 
         clazz.getAnnotation(GuiceManaged.class); 
    
        final Injector injector = createInjector(guiceManagedAnnotation); 
    
        final Object serviceObject = clazz.newInstance(); 
        injector.injectMembers(serviceObject); 
    
        final String address = guiceManagedAnnotation.address(); 
    
        Endpoint.publish(address, serviceObject); 
    } 
    
    private Injector createInjector(final GuiceManaged guiceManagedAnnotation) 
         throws Exception { 
        final Class<? extends Module>[] moduleClasses = 
         guiceManagedAnnotation.module(); 
    
        final List<Module> moduleInstances = new ArrayList<Module>(); 
        for (final Class<? extends Module> moduleClass : moduleClasses) { 
         moduleInstances.add(moduleClass.newInstance()); 
        } 
    
        return Guice.createInjector(moduleInstances); 
    } 
    

    GuiceManaged 주석 :

    @Retention(RUNTIME) 
    @Target(TYPE) 
    @Documented 
    public @interface GuiceManaged { 
        public Class<? extends Module>[] module(); 
        public String address(); 
    } 
    

    그리고 HelloServiceImpl 조각 :

    @GuiceManaged(module = HelloModule.class, 
        address = "http://localhost:8080/helloService") 
    @WebService 
    public class HelloServiceImpl implements HelloService { 
    
        @Inject // bound in HelloModule 
        public GreetingsService greetingsService; 
    
        @Override 
        @WebMethod 
        public String sayHello(final String name) { 
         return greetingsService.sayHello(name); 
        } 
    } 
    
    +1

    대답에 대해 조금 숙고 한 끝에 Endpoint 메커니즘이 새로운 기능을 수행하지 않고 @WebMethod 주석 메서드를 호출한다는 것을 알게되었습니다. 즉, 지금 당장 인스턴스를 제공받은 공급자 만 있으면됩니다. 언제나 그렇듯이 일부 질문은 당신이 그것을하는 방법을 알기 전까지는 어렵습니다. –

    +1

    나는 또한 자주 질문에주의를 끌기 위해 500 포인트 현상금을 사용합니다. 다른 사람들이 질문을 간단하고 답을 사소한 것으로 생각한다면 그것은 나와 잘 맞습니다. –

    0

    AbstractMultiInstanceResolver 확장 점을 사용해야합니다.

    주석을 만듭니다 GuiceManaged; 이제 귀하의 비즈니스 방법에 대한 방법 레벨 DI에 대한 @GuiceManaged & 사용 @Inject하여 서비스를 주석 AbstractMultiInstanceResolver

    public class GuiceManagedInstanceResolver extends AbstractMultiInstanceResolver { 
        private T instance=null; 
        public GuiceManagedInstanceResolver(@NotNull Class clazz) 
        { 
         super(clazz); 
        } 
        public T resolve(@NotNull Packet request) { 
         if(instance==null) 
         { 
          instance=create(); 
          Injector injector= Guice.createInjector(new WebServiceModule()); 
          injector.injectMembers(instance); 
         } 
         return instance; 
        } 
    } 
    

    을 확장하여

    public class GuiceManagedFeature extends WebServiceFeature { 
        public static final String ID="FEATURE_GuiceManaged"; 
    
        @FeatureConstructor 
        public GuiceManagedFeature() 
        { 
         this.enabled=true; 
        } 
    
        public String getID() { 
         return ID; 
        } 
    } 
    

    구현 InstanceResolver :

    @Retention(RUNTIME) 
    @Target(TYPE) 
    @Documented 
    @WebServiceFeatureAnnotation(id=GuiceManagedFeature.ID, bean=GuiceManagedFeature.class) 
    @InstanceResolverAnnotation(GuiceManagedInstanceResolver.class) 
    public @interface GuiceManaged { 
    } 
    

    WebServiceFeatureGuiceManagedFeature 구현 .

    +0

    http://developian.blogspot.com/2008/11/google-guice-and-jax-ws.html에서 영감을 받았습니까? –

    +0

    @ ThorbjørnRavnAndersen 예, 오래 전, 우리는 귀하의 것과 같은 문제가 있었고 우리는 그 블로그를 참고로 사용하려고 시도했습니다. 그런 다음 Guice-Fruit with Guice 2.x를 발견했습니다. –

    +0

    이제 Guice-Fruit을 사용하고 Guice 2와 함께 있어야한다는 의미입니까? –

    관련 문제