我有一个EJB Web服务。我已经创建了由web服务方法抛出的自定义错误类,这非常有效。我的客户捕获这些自定义异常并很好地处理它们。我遇到的问题是,如果在bean的构造函数中发生异常,而我抛出了自定义异常,则客户端不会收到我的自定义异常,它会收到以下内容:
javax.xml.ws.soap.SOAPFaultException: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB
at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:178)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:111)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:108)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
at $Proxy34.getLots(Unknown Source)
我的问题是:是否可以在EJB的构造函数中抛出自定义异常并从客户端接收这些异常?如果是这样的话,我做错了什么?
我的代码:
EJB构造器
public LotManagement() throws LotManagementException
{
try {
pm = new PromisManager();
} catch (UnknownHostException ex) {
java.util.logging.Logger.getLogger(LotManagement.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
FaultBean LotManagementFaultBean = new FaultBean();
throw new LotManagementException(ex.getMessage() + "\n\n" + propMan.getProperty("ContactMessage"), LotManagementFaultBean, ex.getCause());
}
}
故障Bean
package com.onsemi.cim.exception;
import javax.xml.ws.WebFault;
@WebFault(name="LotManagementException")
public class LotManagementException extends Exception {
private static final long serialVersionUID = 1L;
private FaultBean faultBean;
public LotManagementException() {
super();
}
public LotManagementException(String message, FaultBean faultBean,
Throwable cause) {
super(message, cause);
this.faultBean = faultBean;
}
public LotManagementException(String message, FaultBean faultBean) {
super(message);
this.faultBean = faultBean;
}
public FaultBean getFaultInfo() {
return faultBean;
}
}
发布于 2013-10-11 05:34:40
可能的解决方案是,您可以尝试捕获构造函数中的异常并处理那里的所有异常。与你的客户达成协议,你要么抛出一个异常,要么发送一些自定义的错误消息,比如status 0/1等,然后根据响应代码,他们可以决定相应地工作。
此外,我也鼓励您不要抛出自定义异常,并尝试发送错误消息,因为如果将来由于某些原因需要替换您的自定义错误机制,那么您需要要求您的客户端做一些相应的更改。
发布于 2013-10-11 05:13:34
实际上,从构造函数中抛出异常并不是一个好主意,因为不同的API(比如Spring)对待它们的方式是不同的。您之所以会收到这个错误,是因为当您从EJB构造函数获得异常时,它会抛出CreateException。因此,我的意见是检查并尽可能地从构造函数中删除异常。
https://stackoverflow.com/questions/19305165
复制