2015-05-22 2 views
4

Как я могу принять параметр запроса пользовательского типа?Передача параметра запроса пользовательского типа

public String detail(@QueryParam("request") final MYRequest request) { 

Выше линии дает ошибку при запуске сервера

jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization. 

ответ

9

Посмотрите на документации @QueryParam, в отношении приемлемых типов для инъекционных. (То же самое относится и ко всем другим @XxxParam аннотаций также)

  1. примитивного типа
  2. есть конструктор, который принимает один строковой аргумент
  3. иметь статический метод с именем valueOf или fromString, который принимает отдельную строку аргумент (см., например, Integer.valueOf(String))
  4. Имеет зарегистрированную реализацию ParamConverterProvider Расширение SPI JAX-RS, которое возвращает экземпляр ParamConverter, способный преобразовать «из строки» для типа.
  5. Be List<T>, Set<T> или SortedSet<T>, где T удовлетворяет требованиям 2, 3 или 4 выше. Полученная коллекция доступна только для чтения.

Причина этих требований заключается в том, что значение вводится в виде строки. Время выполнения должно знать, как преобразовать строку в тип для ввода. Причиной исключения является то, что при запуске есть первоначальная проверка модели ресурса. Эта проверка проверяет, действительно ли все точки инъекции действительны. Он видит, что введенный тип MyRequest не отвечает ни одному из вышеуказанных требований и выдает исключение.

В основном вы с пунктами 2 и 3, вам нужно будет разобрать строку самостоятельно, например

public class MyRequest { 
    public static MyRequest fromString(string param) { 
     // 1. Parse string 
     // 2. Create MyRequest request; 
     return request; 
    } 
} 

Вы можете увидеть хороший пример использования ParamConverterhere

+0

Что произойдет, если я получил пользовательский класс со многими полями-членами, который имеет конструктор, который принимает единственную строку, которая является просто пустым конструктором? будет ли он все еще проходить объект этого класса с его состоянием? –

+0

@YonatanNir вам нужно построить класс самостоятельно из этой строки. Даже если это означает, что вам нужно вручную разобрать строку. Если в строке есть что-то вроде структуры JSON, взгляните на самую последнюю ссылку в этом сообщении. Он показывает третий вариант. –

+0

Насколько я понимаю, мне нужно построить класс со строкой, которая является определением наличия конструктора String. Я спрашиваю, что произойдет, если у меня есть другие члены в этом пользовательском классе, а мой конструктор - просто пустой конструктор, который принимает параметр String. Будут ли значения других членов проходить вместе с объектом? –

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