XML-RPC - 在Java中从服务器到客户端抛出异常

时间:2011-05-10 15:15:58

标签: java exception-handling xml-rpc

这是我第一次在这里发帖,在搜索过程中找不到我的问题的答案,所以让我们看看能不能正确解释自己。

我使用XML-RPC作为大型项目的一部分,但我将提供一个简化的代码,我将获得相同的结果。

如果我不抛出异常,连接工作正常。我的问题是从服务器到客户端抛出异常。我在客户端获得了XmlRpcException,但其原因始终是 null 。看起来转移时会丢失例外。知道为什么吗?

我的服务器:

public class JavaServer { 

public Integer sum(int x, int y) throws Exception {
throw new MineException("ABABBABA");
}

public static void main (String [] args) {
try {

 System.out.println("Attempting to start XML-RPC Server...");
 WebServer server = new WebServer(80);
 XmlRpcServer xmlRpcServer = server.getXmlRpcServer();
 PropertyHandlerMapping phm = new PropertyHandlerMapping();
 phm.addHandler("test", JavaServer.class);
 xmlRpcServer.setHandlerMapping(phm);
 XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
    serverConfig.setEnabledForExceptions(true);

 server.start();
 System.out.println("Started successfully.");
 System.out.println("Accepting requests. (Halt program to stop.)");
} catch (Exception exception) {
 System.err.println("JavaServer: " + exception);
}}}

我的客户:

public static void main(String[] args) {

    XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
    try {
        config.setServerURL(new URL("http://localhost:80"));
        XmlRpcClient client = new XmlRpcClient();
        client.setConfig(config);           
        Object[] params = new Object[] { new Integer(38), new Integer(3), };

        Integer result = (Integer) client.execute("test.sum", params);
        System.out.println("Results " + result);
    } catch (XmlRpcException exception) {
        Throwable cause = exception.getCause();
        if(cause != null) {
            if(cause instanceof MineException) {
                System.out.println(((MineException)cause).getMessage());
            }
            else { System.out.println("Cause not instance of Exception"); }
        }
        else { System.out.println("Cause was null"); }
        } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

3 个答案:

答案 0 :(得分:3)

我发现通过在客户端和服务器上使用apache xml-rpc实现,可以从服务器抛出自定义异常并在客户端上接收它们。只需要将某些东西添加到服务器和客户端配置中。

服务器:

WebServer server = new WebServer(80);
 XmlRpcServer xmlRpcServer = server.getXmlRpcServer();
 PropertyHandlerMapping phm = new PropertyHandlerMapping();
 phm.addHandler("test", JavaServer.class);
 xmlRpcServer.setHandlerMapping(phm);
 XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
    serverConfig.setEnabledForExceptions(true);
    serverConfig.setEnabledForExtensions(true); //Add this line
 server.start();

客户端:

XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
    try {
        config.setServerURL(new URL("http://localhost:80"));
        config.setEnabledForExceptions(true);
        config.setEnabledForExtensions(true); //Add this line
        XmlRpcClient client = new XmlRpcClient();
        client.setConfig(config);                           
        Object[] params = new Object[] { new Integer(11), new Integer(3), };
        Integer result = (Integer) client.execute(config,"test.sum", params);
        System.out.println("Results " + result);
    } catch (XmlRpcException exception) {
        System.out.println(exception.getMessage());
        Throwable cause = exception.getCause();
        if(cause != null) {
            if(cause instanceof MyException) {
                System.out.println(((MyException)cause).getMessage());
            }
            else { System.out.println("Cause not instance of Exception."); }
        }
        else { System.out.println("Cause was null."); }
        } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

然后一切都按预期工作。

答案 1 :(得分:3)

其他一些(希望是有帮助的)建议。

因此,您希望为异常启用扩展,但是您正在Servlet内部(一个完整的)Web服务器(如Apache Tomcat)中运行该服务。然后,您需要通过在 web.xml 文件(WEB-INF \ web.xml)中配置扩展和例外来启用扩展和例外:

<servlet>
  <servlet-name>My_XMLRPC_Servlet</servlet-name>
    <servlet-class>com.stackoverflow.server.MyXmlRpcServlet</servlet-class>
      <init-param>
        <param-name>enabledForExtensions</param-name>
        <param-value>true</param-value>
      </init-param>
      <init-param>
        <param-name>enabledForExceptions</param-name>
        <param-value>true</param-value>
      </init-param>
        ...
</servlet>

答案 2 :(得分:2)

经过一番调查后,我找到了答案......简短的回答是,根据XMLRPC spec,无法通过XMLRPC频道发送自定义异常:

  

结构可以包含除faultCode和faultString之外的其他成员吗?

     

错误结构可能不包含指定的成员以外的成员。所有其他结构都是如此。我们相信该规范足够灵活,因此可以在指定的结构内容纳所有合理的数据传输需求。如果您坚信这不是真的,请在讨论组上发布消息。

不那么简短的答案是,如果服务器抛出XmlRpcException,则可以以其他方式执行此操作。

public Integer sum(int x, int y) throws XmlRpcException {
   // XmlRpcException(exceptionCode,exceptionMessage)
   throw new XmlRpcException(1,"Message");
}

在客户端:

catch (XmlRpcException exception) {
    System.out.println("Exception code: " + exception.code);
    System.out.println("Exception message: " + exception.getMessage());
}

如果客户端和服务器同意使用定义的代码,则可以通过代码和消息识别异常。它不是真正的自定义异常,但它是我们能够达到的最接近的。