我正在使用Redstone XML-RPC,但这个问题适用于所有XML-RPC通信。
假设:
static interface Jira
{
public String login( String username, String password ) throws XmlRpcFault;
public void logout( String loginToken ) throws XmlRpcFault;
public Issue findIssue(int issueId) throws XmlRpcFault;
}
public static void main( String[] args ) throws Exception
{
Jira jira = ( Jira ) XmlRpcProxy.createProxy( "http://jira.atlassion.com/RPC2", new Class[] { Jira.class } );
String token = jira.login( args[ 0 ], args [ 1 ] );
jira.logout( token );
}
说我调用了findIssue远程过程。我是经过身份验证的用户。可能会发生三件事:
1)找到了Issue对象,我有权使用它,远程序列化,并在本地进行反序列化。 2)找到了Issue对象,但我没有授权使用它。 3)找不到Issue对象。
2和3是异常情况,但据我所知,XML-RPC不支持异常。如果只有案例1)和3),我可能会返回一个null问题,如果没有找到,但由于还有其他可能性,我需要一个更通用的解决方案。
谢谢!
答案 0 :(得分:0)
我还没有使用过Redstone库,但是看看Javadoc,当你调用一个返回错误代码的服务时,它确实有一个在客户端使用的XmlRpcFault,但我不能立即看到如何在服务器上进行。
对于Apache XML-RPC,他们明确地不支持它在服务器上并且总是返回0.这个库看起来做得非常相似,你可以采用的解决方法可能类似。
基本上我抛出了一个自定义的RuntimeException,然后在其他一层抓住了它。理想情况下,可以在servlet实现中捕获它,但在我的情况下,我必须增强其几个类以正确传播异常,因为它们在内部使用了catch(Exception)。