1

だから私はJavaのmosesxml-rpcサーバーにxml-rpcメッセージを送信しようとしていますが、エラーが発生し続けます:

org.apache.xmlrpc.XmlRpcException: Parameter that is supposed to be a structure is not

http://ws.apache.org/xmlrpc/client.htmlのApachexmlrpcクライアント3.1.3を使用しています。私の推測では、パラメーター定義には互換性がありませんが、入力として使用する別のタイプを試した後でも、出力は同じです。私はクライアントの例を持っていますが、それはperlで書かれています:

#!/usr/bin/env perl

use Encode;
use XMLRPC::Lite;
use utf8;

$url = "http://localhost:8080/RPC2";
$proxy = XMLRPC::Lite->proxy($url);

$text = "il a souhaité que la présidence trace à nice le chemin pour l' avenir .";

# Work-around for XMLRPC::Lite bug
$encoded = SOAP::Data->type(string => Encode::encode("utf8",$text));

my %param = ("text" => $encoded, "align" => "true");
$result = $proxy->call("translate",\%param)->result;
print $result->{'text'} . "\n";
if ($result->{'align'}) {
    print "Phrase alignments: \n";
    $aligns = $result->{'align'};
    foreach my $align (@$aligns) {
        print $align->{'tgt-start'} . "," . $align->{'src-start'} . "," 
            . $align->{'src-end'} . "\n"; 
    }
}

そしてここに私のコードがあります:

XmlRpcClientConfigImpl tConf = new XmlRpcClientConfigImpl();
try {
    tConf.setServerURL(new URL("http://127.0.0.1:8080/RPC2"));
    tConf.setBasicEncoding("UTF-8");
} catch (MalformedURLException ex) {
    ex.printStackTrace(System.out);
}
XmlRpcClient tClient = new XmlRpcClient();
tClient.setConfig(tConf);

List<List<String>> tInPar = new ArrayList<>();
tInPar.add(Arrays.asList(new String[]{"text", "hello"}));
tInPar.add(Arrays.asList(new String[]{"align", "true"}));

String tResult = null;
try {
    tResult = (String) tClient.execute("translate", tInPar);
} catch (XmlRpcException ex) {
    ex.printStackTrace(System.out);
}

それが正しいか?

ご協力ありがとうございました

4

2 に答える 2

1

mosesメーリングリストで相談した後、mosesサーバーのJavaクライアントの例を示しました:https ://github.com/moses-smt/mosesdecoder/blob/master/contrib/server/SampleClient.java

ありがとう

于 2012-01-17T13:45:18.493 に答える
0

私はJavaを知らないので、コードをチェックできません。クライアントにSOAP経由で送信されるXML以外の接続方法がある場合は、それを使用してください。これは、私が過去に見たすべてのSOAPおよびほとんどのXMLAPIに当てはまります。

そのPerlコードを実行し、それが機能していることを確認しましたか?

含まれている場合:デバッグを追加して、それが何をするかを確認し、これをスクリプトと比較します。XMLRPC :: Liteは、SOAP :: Liteに基づいていると主張しており、SOAP::Liteを使用するとデバッグが行われます。

use SOAP::Lite +trace;

3つのチャンス:最初に、この行を追加すると、XMLRPC::Liteのデバッグも可能になります。2番目:「+trace」フラグを「useXMLRPM :: Lite」行に追加して、デバッグを有効にします。3番目:XMLRPC :: Liteとして呼び出された場合、SOAPデバッグは不可能かもしれません。

詳細については、こちらをご覧ください: http: //metacpan.org/pod/SOAP ::Trace

最後に、tcpdumpのようなパケットスニファは、送信されているものを表示する場合があります。

XML構造がPerlのものと異なるか、空白、改行、または要素の順序のみが異なり、反対側のサーバーが真のXMLを受け入れず、キーワードが<>に含まれるテキストブロックを受け入れているのではないかと思います。

于 2012-01-16T07:09:43.907 に答える