0

簡単だと確信しているものを設定するのに苦労しているので、それを群衆に投げると思いました。WebやSEの他の場所で探しているものが見つからないようです。

もちろんプロジェクトを単純化していますが、基本的には次のようなJAX-WSの非注釈付きJerseyリソースクラスがあります。

@Path("myresource")
public class MyResource {

    @Autowired
    MyComplexObjectDAO daoInstance;

    @Path("findObject/{id}")
    @GET
    public MyComplexObject findObject( @PathParam(value="id") String id ) {
        return daoInstance.findObject( id );
    }

    @Path("saveObject")
    @PUT
    public MyComplexObject saveObject( MyComplexObject objectToSave ) {
        MyComplexObject savedObject = daoInstance.saveObject( objectToSave );
        return savedObject;
    }

}

したがって、Springを使用してDAOオブジェクトを自動配線していることがわかります。次に、RESTハンドラーでDAOメソッドを使用します。

'findObject'呼び出しは正常に機能しているようです。これまでのところ、期待どおりに機能しています。

'saveObject'呼び出しが希望どおりに機能していないため、アドバイスが必要です。

複雑なオブジェクトのインスタンスをRESTメソッドのパラメーターとして直接取得しようとしていることがわかります。さらに、保存後に複雑なオブジェクトのインスタンスを返したいと思います。

これをテストするために、いくつかの「クライアント」コードをまとめました。

@Test
public void saveTest() {
    WebResource wsClient = createWebServiceClient();

    MyComplexObject unsavedInstance = createMyComplexObject();

    MyComplexObject savedInstance = 
            wsClient
            .path("saveObject")
            .accept(MediaType.APPLICATION_XML)
            .put(MyComplexObject.class, unsavedInstance);

    assertNotNull(savedIntent);
}

次のエラーが返されます。

com.sun.jersey.api.client.UniformInterfaceException: PUT http://localhost:8081/rest/myresource/save returned a response status of 400 Bad Request

なぜこれが機能しないのかわかりません。私は考えられるすべてのことを試したと思います。どんな助けや指示も大歓迎です。

本当にありがとう!

4

2 に答える 2

1

テストクライアントでaccept()メソッドを呼び出していることがわかります(つまり、リクエストに「Accept:」ヘッダーが追加され、希望する表現のタイプをサーバーに示します)。ただし、type() メソッドを呼び出して「Content-type:」ヘッダーを追加し、XML データを送信していることをサーバーに通知することはしません。例については、 http://jersey.java.net/nonav/documentation/latest/client-api.html#d4e644を参照してください。

補足: あなたの URL は RESTful ではありません - パスに動詞を含めないでください:

したがって、代わりに:

/api/findObject/{id}
/api/saveObject

以下を使用する必要があります。

/api/objects/{id}
/api/objects

最後の注意: /api/objects の呼び出しでオブジェクトを作成するには、REST のベスト プラクティスと広く採用されているパターンに準拠するために、PUT ではなく POST を実行する必要があります。

于 2012-12-22T06:48:33.127 に答える
0

以前のコメントでほのめかした「具体的なクラス」ソリューションに切り替えることで、問題が解決しました。

于 2013-03-25T18:16:29.710 に答える