2015-04-16 1 views
4

У меня возникла странная проблема, которую я абсолютно не понимаю, с Jersey 2.6.Jersey ModelValidationException - нет Источник впрыска

Я не могу объяснить почему, но один из параметров запроса джерси макияжа бросить ModelValidationException

@ApiOperation("Save") 
    @PUT 
    public Response save(
      @HeaderParam("token") final String token, 
      @QueryParam("someValue") final SomeValueDTO someValue, 
      @QueryParam("anotherParam") final int anotherParam) throws TechnicalException { 

     return Response.ok().build(); 
    } 

в queryParam 'SomeValue' сделать джерси бросок:

org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.|[[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response ch.rodano.studies.api.resources.PagesResource.save(java.lang.String,ch.rodano.studies.api.dto.JSONValueDTO,int) throws ch.rodano.studies.exceptions.RightException,ch.rodano.studies.configuration.exceptions.NoNodeException at index 1.; source='ResourceMethod{httpMethod=PUT, consumedTypes=[], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class ch.rodano.studies.api.resources.PagesResource, handlerConstructors=[[email protected]]}, definitionMethod=public javax.ws.rs.core.Response ch.rodano.studies.api.resources.PagesResource.save(java.lang.String,ch.rodano.studies.api.dto.JSONValueDTO,int) throws ch.rodano.studies.exceptions.RightException,ch.rodano.studies.configuration.exceptions.NoNodeException, parameters=[Parameter [type=class java.lang.String, source=token, defaultValue=null], Parameter [type=class ch.rodano.studies.api.dto.JSONValueDTO, source=valuesASD, defaultValue=null], Parameter [type=int, source=visitPk, defaultValue=null]], responseType=class javax.ws.rs.core.Response}, nameBindings=[]}'] 

Если я использую String вместо SomeValueDTO, все в порядке. SomeValueDTO - довольно классический POJO с пустым конструктором и геттерами/сеттерами.

Если у кого-то есть иди!

ответ

5

SomeValueDTO должен быть конвертируемым. Опции для достижения этой цели:

  1. Публичный статический valueOf(String param) возвращает тип
  2. публичный статический fromString(String param), который возвращает тип
  3. Или публичный конструктор, который принимает строку
  4. Реализовать ParamConverter. Вы можете увидеть пример here

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

+0

Спасибо за быстрый ответ! Итак, если я понимаю, мне нужно разобрать jsonString в объект? SomeValueDTO содержит только простой тип, например String или int, нет способа сделать трикотаж автоматически проанализированным? – tanou

+0

Это не имеет значения. Как вы ожидаете, что Джерси узнает, как преобразовать String в случайный объект? Он не знает, что входит JSON. Лично я никогда не отправлял JSON в строку запроса. Это всего лишь я. Эти четыре вещи, о которых я упоминал, являются частью спецификации о том, как вводить объекты для '@ XxxParam'. Все значения параметров вводятся как строки. Поэтому нам нужно сказать Джерси, как его конвертировать –

+0

в порядке, наверное, я ожидал от него слишком многого. С уважением, Весна;) Еще раз спасибо! – tanou

1

От Джерси 2.0, вы можете использовать @BeanParam в качестве входных данных, но вы должны установить все @QueryParam в переменных DTO:

@ApiOperation("Save") 
@PUT 
public Response save(@BeanParam SomeValueDTO inputValue) 
{ 
    String prop1 = inputValue.prop1; 
    String prop2 = inputValue.prop2; 
    String prop3 = inputValue.prop3; 
} 

SomeValueDTO.java будет:

public class SomeValueDTO{ 
@QueryParam("prop1") 
public String prop1; 

@QueryParam("prop2") 
public String prop2; 

@QueryParam("prop3") 
public String prop3; 
} 

вызов HTTP может быть:

$http.get('insert-path', { 
    params: { 
     prop1: "prop1value", 
     prop2: "prop2value", 
     prop3: "prop3value" 
}}); 

Источник ответа: https://stackoverflow.com/a/17309823/3410465

Смежные вопросы