如何在Spring ContextLoaderListener中捕获/更正异常?

时间:2010-08-23 08:25:54

标签: spring

我正在使用Spring的ContextLoaderListener来初始化Web服务客户端,但是如果在应用程序启动期间wsdl文档不可用,那么我的应用程序的一部分就会被破坏,我不知道如何修复它。应用程序成功启动,只记录该点的大堆栈跟踪。例外是:

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吗?

2 个答案:

答案 0 :(得分:3)

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

否则,您必须创建一个进行此检查的代理。代理可以通过以下方式创建:

  • java.lang.reflect.Proxy
  • CGLIB
  • 了Javassist

答案 1 :(得分:0)

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

  1. 防止javax.xml.ws.WebServiceException异常传播出您的控件。您将通过在代码中的某处捕获异常来实现此目的。
  2. 请注意,在抛出异常时,您必须重新尝试在调用Web服务时引发异常的调用。
  3. 接受错误发生。如果在用户尝试执行某些操作时抛出异常,则需要通知用户发生错误并且需要再次尝试(可能在一段合理的时间之后)。
  4. 以下是一个例子:

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