2016-05-31 3 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

Вы должны использовать аннотацию JAX-RS по вашему параметру 'name'. Какая часть запроса отображается на нем? –

ответ

2

Что вы пытаясь достичь, это сопоставить несколько параметров с вашим REST API с полезной нагрузкой JSON метода POST, Это невозможно, пожалуйста, посмотрите на this answer для деталей.

Я понимаю, что вы хотите передать список свойств; выше ответ не вполне устраивает свой сценарий,

что я предлагаю здесь: конвертировать ваше имени параметра для параметра в пути или параметр в запроса в зависимости от того, если это не является обязательным или нет ,

так что ваши должны усилить это следующим образом:

параметр пути (если имя параметр является обязательным)

@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 .../конфигурации имя = name1

и, очевидно, в обоих случаях, вы не должны пройти «имя» параметр в вашей полезной нагрузке JSON.

+0

Я сожалею, что ваш ответ также не подходит для моего сценария, моя проблема в отношении объекта MultiValueMap, а не имя свойства. Но я попробовал ваше предлагаемое решение, но его разрыв моего кода больше – Yougesh

+0

. Я также сделал кое-что вроде: ' @POST @Path ("/ config") @Consumes (MediaType.APPLICATION_JSON) public Response saveConfiguration (MyClass myClass) { return Response.ok(). Build(); } ' И мой класс ' class MyClass { private String name; private Map свойства; /* сеттер, добытчик */ } ' но в службе отдыха я получаю полезную нагрузку этого ' "{" имя ": "CRJ001", "свойства": {}}" ' пустые свойства – Yougesh

+1

@ Y-PKhatri, что сломалось? как вы применили изменения, которые я предложил? что вы получаете erro (если есть)? Вы соответствующим образом адаптировали свою полезную нагрузку JSON? , если вы решите поместить как имя, так и свой список свойств в том же объекте, который должен работать, не забудьте комментировать класс MyClass с помощью «@XmlRootElement». – LeTex