2010-08-23 53 views
3

我使用Spring的ContextLoaderListener来初始化一个Web服务客户端,但是如果wsdl文档在应用程序启动过程中不可用,那么我的应用程序的一部分被破坏,我不知道如何解决它。应用程序启动成功,只需在该点记录一个大的ol栈跟踪。唯一的例外是:如何在Spring ContextLoaderListener中捕获/更正异常?

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myWebService' defined in class path resource [spring-myapp-jaxws.xml]: Invocation of init method failed; nested exception is javax.xml.ws.WebServiceException: The following WSDL exception occurred... etc.

几个问题...

  • 我能赶上在init例外,这样我可以在我的应用程序适当地显示损坏的元件的状态?
  • 我可以告诉Spring尝试在用户请求上重新初始化myWebService bean吗?

回答

3

尝试将该bean定义为lazy="true",以便在未引用它时不会进行初始化。

否则,您将不得不创建一个代理来执行此检查。代理可以通过以下方式创建:

  • java.lang.reflect.Proxy
  • CGLIB
  • Javassist是
+0

我考虑延迟初始化的WS豆,决定了反对它不能解决问题 - 当用户第一次尝试使用WSDL可能不可用它。 Re:创建一个代理 - 你的意思是创建一些东西来包装Web服务bean来执行异常处理,如果服务没有被正确引用,则尝试重新初始化?关于代理的 – Brabster 2010-08-23 09:20:31

+0

- 是的。 – Bozho 2010-08-23 11:45:46

0

您的选项似乎都可以归结为以下几点:

  1. 防止从javax.xml.ws.WebServiceException例外传播出你的控制。您将通过捕获代码中某处的异常来实现此目的。
  2. 注意当引发异常时,当调用Web服务时,您将不得不重新尝试抛出异常的调用。
  3. 接受错误发生。如果在用户尝试执行某些操作时引发异常,则需要通知用户发生了错误,并且需要再次尝试(也许经过一段合理的时间后)。

下面是一个例子:


public interface MyWebServiceCallingInterface 
{ 
    String callTheWebService(); 
} 

public class MyWebService extends something, 
implements MyWebServiceCallingInterface 
{ 
    public MyWebService() 
    throws javax.xml.ws.WebServiceException 
    { 
     ... do stuff, maybe throw exception ... 
    } 

    public String callTheWebService() 
    { 
     ... do stuff ... 
    } 
} 

public class MyWebServiceWrapper 
implements MyWebServiceCallingInterface 
{ 
    private MyWebService myWebService; 

    public MyWebServiceWrapper() 
    { 
     createWebService(); 
    } 

    public String callTheWebService() 
    { 
     if (myWebService == null) 
     { 
      createWebService(); 
     } 

     if (myWebService != null) 
     { 
      return myWebService.callTheWebService(); 
     } 
     else 
     { 
      ...error handling stuff... 
      return ... something meaningful ... 
     } 

    } 

    private void createWebService() 
    { 
     try 
     { 
      myWebService = new MyWebService(); 
     } 
     catch (javax.xml.ws.webServiceException exception) 
     { 
      myWebService = null; 
     } 
    } 
}