2016-05-31 39 views
3

私のサービスで問題が発生しています。 以下は私のサービスMultivalueMapを使用したポストコールの問題

@POST 
@Path("/config") 
@Consumes(MediaType.APPLICATION_JSON) 
public Response saveConfiguration(String name, MultivaluedMap<String, 
    Object> properties) { 
    return Response.ok().build(); 
} 

ですそして、私のテストケースは次のとおりです。

String payload = "{"name": "CRJ001", 
    "properties": {"expression": ["a + b"], 
    "baseClass": ["org.carlspring.strongbox.crontask.test.MyTask"]}}"; 

WebTarget resource = client.getClientInstance().target(path); 
Response response = resource.request(MediaType.APPLICATION_JSON). 
    post(Entity.entity(payload, MediaType.APPLICATION_JSON)); 

int status = response.getStatus(); 
assertEquals("Failed to save!", Response.ok().build().getStatus(), status); 

しかし、私は取得しています:

[[FATAL] Method public javax.ws.rs.core.Response org.abc.rest.ConfigurationRestlet. 
    saveConfiguration(java.lang.String,javax.ws.rs.core.MultivaluedMap) 
    on resource class org.abc.rest.ConfigurationRestlet contains multiple 
    parameters with no annotation. Unable to resolve the injection source.; 

私に助けてください、このうち、あなたは何

+0

'org.abc.rest.ConfigurationRestlet'とは何ですか? –

+0

休憩サービスクラス – Yougesh

+0

パラメータ 'name'にJAX-RSアノテーションを使用する必要があります。要求のどの部分がマップされていますか? –

答えて

2

複数のパラメータをPOSTメソッドのJSONペイロード()からREST APIにマップすることですこれはできません。詳しくは、this answerをご覧ください。

プロパティのリストを渡したいと思います。上記の答えは非常にあなたのシナリオに合わない、

私はここに提案することである:それはオプションであるかどうかに応じて、pathパラメータまたはクエリパラメータにご名前パラメータを変換します。

ので、あなたはこのようにそれを強化する必要があります。

pathパラメータ(パラメータが必須である場合)

@POST 
@Path("/config") 
@Consumes(MediaType.APPLICATION_JSON) 
public Response saveConfiguration(@PathParam("name") String name, MultivaluedMap<String, 
    Object> properties) { 
    return Response.ok().build(); 
} 

クエリパラメータ(名パラメータがオプションである場合)

@POST 
@Path("/config/{name}") 
@Consumes(MediaType.APPLICATION_JSON) 
public Response saveConfiguration(@QueryParam("name") String name, MultivaluedMap<String, 
    Object> properties) { 
    return Response.ok().build(); 
} 
このケース名で

リクエストのクエリパラメータとして渡されます:?...

POST/configの名前= NAME1

と明らかに両方のケースでは、あなたは「名前」を渡すべきではありませんJSONペイロードのパラメータ

+0

あなたの答えは私のシナリオにも合わないと申し訳ありません。私の問題はMultiValueMapオブジェクトで名前プロパティではありませんが、私はあなたの提案したソリューションを試しましたが、私のコードを破っていますmore – Yougesh

+0

私もそのようなことをしました: ' @POST @Path( "/ config") @Consumes(MediaType.APPLICATION_JSON) パブリックレスポンスsaveConfiguration(MyClass myClass){ return Response.ok()。build(); } ' 私のクラスは です。' class MyClass { プライベートString name; プライベートマッププロパティ。 /*セッター、ゲッター*/ } ' が、残りのサービスで、私はペイロードを受けています。この ' "{" 名 ": "CRJ001"、 "プロパティ":{}}" ' 空のプロパティ – Yougesh

+1

@ Y-PKhatri何が壊れた?私が提案した変更をどのように適用しましたか?あなたが得るエラー(もしあれば)は何ですか?それに応じてJSONペイロードを調整しましたか? 名前とプロパティのリストを同じオブジェクトに入れたい場合は、 'MyClass'クラスに '@XmlRootElement'という注釈を付けることを忘れないでください。 – LeTex

関連する問題