Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在ejbweb服务的构造函数中引发异常_Java_Jakarta Ee_Ejb_Jax Ws_Glassfish 3 - Fatal编程技术网

Java 在ejbweb服务的构造函数中引发异常

Java 在ejbweb服务的构造函数中引发异常,java,jakarta-ee,ejb,jax-ws,glassfish-3,Java,Jakarta Ee,Ejb,Jax Ws,Glassfish 3,我有一个ejbweb服务。我已经创建了由web服务方法抛出的自定义错误类,这非常有效。我的客户捕获了这些自定义异常,并对它们进行了良好的处理。我遇到的问题是,如果bean的构造函数中发生异常,并且我抛出了自定义异常,那么客户端不会收到自定义异常,它会收到以下内容: javax.xml.ws.soap.SOAPFaultException: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless E

我有一个ejbweb服务。我已经创建了由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());
    }
}
菜豆

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

}

实际上,从构造函数抛出异常并不是一个好主意,因为像Spring这样的不同API对待异常的方式不同。您之所以会遇到这个错误,是因为当您从EJB构造函数中获得异常时,它会抛出CreateException。
所以我的意见是检查并可能从构造函数中删除异常

可能的解决方案是,尝试在构造函数中捕获异常并在那里处理所有异常。与您的客户达成协议,您将抛出异常或发送一些自定义错误消息,如状态0/1等,并根据响应代码决定相应的工作


此外,我还鼓励您不要抛出自定义异常并尝试发送错误消息,因为将来如果出于某种原因,您需要更换自定义错误机制,那么您需要要求您的客户进行相应的更改。

您打算如何解决他提到的问题?我在这里看到的问题是作为web服务的构造函数,我甚至看不到将消息返回给客户端的方法。我几乎必须在构造函数中设置一个全局变量,web服务方法将读取该变量以查看是否存在问题,然后在方法中返回失败。对我来说,这看起来真的很烦人和混乱。