0

次のフォーラム投稿のような同様の問題が発生しました。

http://jersey.576304.n2.nabble.com/parsing-JSON-with-Arrays-using-Jettison-td5732207.html

Jettison 1.2 で Resteasy 2.0.1GA を使用すると、ネームスペース マッピングが関係する場合に配列のマーシャリングに問題が発生します。以下のコードを参照してください。基本的に、配列エントリの数が 1 より大きく、ネームスペース マッピングが使用されている場合。他の誰かがこの問題に遭遇しますか? Nabble フォームのポスターは、カスタム アンマーシャラーを作成することで回避しました。

Jettison のバグを分離するか、JettisonMappedUnmarshaller クラスの Resteasy 拡張機能を作成する必要があります (名前空間のマッピングとアンマーシャラーを Jettison 構成に渡します)。

プロパティ変数に 2 つ以上のエントリが含まれている場合、次のコードは非整列化 (ポスト ステップ) しません。


public class Experimenting {

    @Path("test")
    public static class MyResource {
        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "Property", propOrder = { "name", "value" })
        public static class MyProperty {
            @XmlElement(name = "Name", required = true)
            protected String name;
            @XmlElement(name = "Value", required = true)
            protected String value;

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public String getValue() {
                return value;
            }

            public void setValue(String value) {
                this.value = value;
            }
        }

        @XmlType(name = "MyElement", propOrder = { "myProperty" })
        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlRootElement(name = "MyElement", namespace = "http://www.klistret.com/cmdb/ci/commons")
        @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://www.klistret.com/cmdb/ci/commons", jsonName = "com.klistret.cmdb.ci.commons") })
        public static class MyElement {
            @XmlElement(name = "MyProperty", namespace = "http://www.klistret.com/cmdb/ci/commons")
            protected List myProperty;

            public List getMyProperty() {
                if (myProperty == null) {
                    myProperty = new ArrayList();
                }
                return this.myProperty;
            }

            public void setMyProperty(List myProperty) {
                this.myProperty = myProperty;
            }
        }

        @GET
        @Path("myElement/{id}")
        @Produces(MediaType.APPLICATION_JSON)
        public MyElement getMy(@PathParam("id")
        Long id) {
            MyElement myElement = new MyElement();

            MyProperty example = new MyProperty();
            example.setName("example");
            example.setValue("of a property");

            MyProperty another = new MyProperty();
            another.setName("another");
            another.setValue("just a test");

            MyProperty[] properties = new MyProperty[] { example, another };
            myElement.setMyProperty(Arrays.asList(properties));

            return myElement;
        }

        @POST
        @Path("/myElement")
        @Consumes(MediaType.APPLICATION_JSON)
        @Produces(MediaType.APPLICATION_JSON)
        public MyElement createMy(MyElement myElement) {
            List properties = myElement.getMyProperty();
            System.out.println("Properties size: " + properties.size());

            return myElement;
        }
    }

    private Dispatcher dispatcher;

    @Before
    public void setUp() throws Exception {
        // embedded server
        dispatcher = MockDispatcherFactory.createDispatcher();
        dispatcher.getRegistry().addPerRequestResource(MyResource.class);

    }

    @Test
    public void getAndCreate() throws URISyntaxException,
            UnsupportedEncodingException {
        MockHttpRequest getRequest = MockHttpRequest.get("/test/element/44");
        MockHttpResponse getResponse = new MockHttpResponse();

        dispatcher.invoke(getRequest, getResponse);
        String getResponseBodyAsString = getResponse.getContentAsString();

        System.out.println(String.format(
                "Get Response code [%s] with payload [%s]", getResponse
                        .getStatus(), getResponse.getContentAsString()));

        MockHttpRequest postRequest = MockHttpRequest.post("/test/element");
        MockHttpResponse postResponse = new MockHttpResponse();

        postRequest.contentType(MediaType.APPLICATION_JSON);
        postRequest.content(getResponseBodyAsString.getBytes("UTF-8"));

        dispatcher.invoke(postRequest, postResponse);
        System.out.println(String.format(
                "Post Response code [%s] with payload [%s]", postResponse
                        .getStatus(), postResponse.getContentAsString()));
    }
}
4

1 に答える 1

1

Jettison を使用する必要がありますか? そうでない場合は、代わりにジャクソンを使用するように切り替えることをお勧めします。これは通常、配列/リストに関連する問題を解決します (Jettison の問題は、XML モデルに変換されることです。これにより、配列とオブジェクトを区別することが非常に難しくなります。バグもありますが、正しく動作させることは根本的に困難です)。

于 2011-01-06T18:26:50.103 に答える