2017-02-03 1 views
0

Apache Axis를 SOAP 클라이언트로 사용하여 스프링으로 통합을 설정했습니다.로그 축 클라이언트 요청 및 응답 Spring bean을 사용하여

처리기를 스프링 컨텍스트 외부에있는 클래스로 구성하도록 client-config.wsdd를 설정할 수 있습니다. 내가하고 싶은 것은 Spring 컨텍스트 내에 있도록 핸들러를 설정하는 것이다. 이게 가능할까요?

여기 내 현재 client-config.wsdd

<?xml version="1.0" encoding="UTF-8"?> 
<deployment name="defaultClientConfig" 
      xmlns="http://xml.apache.org/axis/wsdd/" 
      xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> 

    <handler name="log" type="java:xxx.xxx.handler.SOAPLogHandler"> 
    </handler> 

    <globalConfiguration> 
     <parameter name="disablePrettyXML" value="false"/> 
     <requestFlow> 
      <handler type="log"/> 
     </requestFlow> 
     <responseFlow> 
      <handler type="log"/> 
     </responseFlow> 
    </globalConfiguration> 

    <transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/> 
</deployment> 

나는 또한 서비스가 봄에 등록 :

<bean id="wsYPSoap" class="xxx.xxx.core.ws.WsYPSoapProxy"> 
    <constructor-arg value="${xxx.service.url}" /> 
</bean> 

답변

0

내가 축 클라이언트에 대한 핸들러로 직접 스프링 빈을 사용하는 방법을 찾고되었고, 요청/응답 세부 정보를 기록하기위한 용도로 사용됩니다.

현재로서는 쉽고 간단한 방법이없는 것처럼 보입니다.

그러나 Axis 핸들러에서 응용 프로그램 루트 컨텍스트를 통해 Spring 빈에 액세스하여이를 수행하는 방법이 있습니다. 몇 가지 문제는 여기에 있습니다 : 그들은

  • 핸들러 인스턴스, 즉 얼굴 어떤 서블릿의 존재 (또는,에 의존하지 수있는 간단한 클래스 (안 콩)으로 필요할 때

    • 축 처리기가 인스턴스화 당시) 컨텍스트가 자신의 invoke() 방법이 때문에

    라고, 루트 애플리케이션 컨텍스트에서 Spring 빈을 배치해야합니다. 문제는 보통 방식 (예 : ServletContext : FacesContext)으로 애플리케이션 컨텍스트에 액세스 할 수 없다는 것입니다. 이것에 대한 해결 방법은 Axcess 핸들러에서 사용할 수 있도록 응용 프로그램 시작시 루트 응용 프로그램 컨텍스트에 대한 참조를 저장하는 자신의 ApplicationContextAware bean을 만드는 것입니다.

    최소 ApplicationContextAware 빈 구현 예 :이 중요입니다 ,

    <bean id="appContextProvider" lazy-init="false" class="package.where.the.class.is.ApplicationContextProvider" /> 
    

    주의 선언에서 lazy-init="false" :

    public class ApplicationContextProvider implements ApplicationContextAware { 
        private static ApplicationContext rootAppContext; 
    
        @Override 
        public void setApplicationContext(ApplicationContext ctx) throws BeansException { 
         rootAppContext = ctx; 
        } 
    
        public static ApplicationContext getApplicationContext() { 
         return rootAppContext; 
        } 
    } 
    

    application-context.xml

    는 빈을 선언합니다. 이 빈은 어디에서나 참조되거나 (자동으로 유선화된 것이 아니기 때문에), Spring은 bean 생성을 위해 게으른 전략을 사용하기 때문에 Spring은 그 인스턴스를 생성하지 않습니다. lazy-init을 false로 설정하면 앱 시작시 빈이 만들어집니다. 반드시 당신을 확인

    ApplicationContext ctx = ApplicationContextProvider.getApplicationContext(); 
    if (ctx != null) { 
        DBLogBean bean = (DBLogBean) ctx.getBean("yourDBLogBeanId"); 
        if(bean != null) { 
         bean.doLogOrSomething(); 
        } 
    } 
    

    :

    은/봄에 의해 만들어진,이 같은 즉 축 처리기에 액세스 할 수 있습니다 (DBLogBean 클래스에 의해 구현) 귀하의 DB 로깅 콩을 가지고 제공 제대로 설정 및로드 문맥에서 DB bean을 가져 오기 전에 ApplicationContextProvider.getApplicationContext()null을 리턴하는지 확인하십시오. 이제 ctx.getBean()null을 반환하는지 확인해야합니다.이 옵션을 선택하지 않으면

    은 (축 처리기가 호출 될 때마다 당신은 DB 콩이 있어야합니다 어떤 이유 즉), 당신은 확실히 축 처리기를 만들어야 오직ApplicationContextProvider 콩을 만든 후 라고합니다. lazy-init="false"를 사용하여 콩을 만들기 하지 빈 인스턴스를 생성하는 선호하는 방법입니다 :

    참고) 그 주제는, 그러나, 여기 범위를 벗어납니다. 콩은 다른 bean/code에 의해 자동 유선/참조되고 Spring에 남겨져 라이프 사이클을 관리해야합니다. 예를 들어 시작시 빈 생성 을 강요하는 단점은 추가 단계를 거치지 않으면 ( ) 다른 코드에 의해 참조되는지 확인하지 않는 한 생성 된 시점이 이고 사용할 수있게 될지 확신 할 수 없다는 것입니다 그런데 왜 처음에는 lazy-init="false"을 사용해야하나요?).

  • 관련 문제