Как обрабатывать сообщения об ошибках в XML-RPC? - PullRequest
1 голос
/ 17 января 2012

Я использую 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), я мог бы вернуть нулевую проблему, если она не была найдена, но, поскольку есть другие возможности, мне нужно более общее решение.

Спасибо!

1 Ответ

0 голосов
/ 15 мая 2012

Я еще не использовал библиотеку Redstone, но, глядя на Javadoc, она имеет XmlRpcFault для использования на стороне клиента, когда вы вызываете сервис, который возвращает код ошибки, но я не могу сразу увидеть, как сделать это на сервере.

В случае Apache XML-RPC они явно не поддерживали его на сервере и всегда возвращали бы 0. Эта библиотека, похоже, работала очень схожим образом, и возможный обходной путь, который вы можете использовать, вероятно, похож.

По сути, я сгенерировал специальное RuntimeException, а затем перехватил его на каком-то другом слое. В идеале было бы возможно поймать его при реализации сервлета, но в моем случае мне пришлось улучшить несколько их классов, чтобы правильно распространить исключение, потому что они использовали catch (Exception) повсюду внутри.

...