1

JSONデータ表現でJerseyを使用してオブジェクトフィールドを逆シリアル化できません。フィールド「data」には、整数、文字列、文字列のリスト、...、またはその他のJAXBタグ付きオブジェクトを含めることができます。

これは私のコードです:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ReturnValue{    

    private Object data;

    public ReturnValue() { }

    public ReturnValue(Object data) {
        this.data = data;
    }

    public Object getData() {
        return data;
    }

    @Override
    public String toString() {
        return "ReturnValue [data=" + data + "]";
    }

}

クライアントは次のようになります。

public class MyClient {

    private String location = "http://localhost:9998/test";
    private Client client;
    private WebResource resource;

    public MyClient() {
        init();
    }

    private void init() {
        ClientConfig clientConfig = new DefaultClientConfig();
        clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
        client = Client.create(clientConfig);
        resource = client.resource(location);
    }

    private void test() {
        ClientResponse response = resource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
        ReturnValue value = response.getEntity(ReturnValue.class);
        System.out.println(value);
    }

    public static void main(String[] args) {
        MyClient client = new MyClient();
        client.test();
    }

}

それがリソースです:

@Singleton
@Path("/test")
public class Test {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Object get() {
        return Response.ok(new ReturnValue("TEST_SERVER")).build();
    }

}

シリアル化されたオブジェクトは正しく見えます:

{"data":{"@type":"xs:string","$":"TEST_SERVER"}}

これはコンソールの出力です:

ReturnValue [data={@type=xs:string, $=TEST_SERVER}]

ご覧のとおり、文字列はインスタンス化されていません。問題を解決するにはどうすればよいですか?

4

1 に答える 1

0

問題は、 in のタイプとして使用することjava.lang.Objectです。このため、JAXB は結果をデータの型 (実際には) とともにマーシャリングし、クライアント側でオブジェクトをアンマーシャリングする方法を認識します。dataReturnValueString

あなたの初期を使用した次のコードReturnValue

ByteArrayOutputStream baos = new ByteArrayOutputStream();
JAXB.marshal(new ReturnValue("cvb"), baos);
System.out.println(new String(baos.toByteArray()));

この出力が生成されます (xsi:type="xs:string" を参照):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<returnValue>
    <data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">cvb</data>
</returnValue>

、しかし、データ属性のタイプを文字列に変更すると、Jaxb が文字列とプリミティブを処理する方法により、次のようになります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<returnValue>
    <data>cvb</data>
</returnValue>

同様に、テストすると次のように出力されます。

TEST_SERVER
于 2012-10-30T00:21:24.303 に答える