Ошибка при @BeanParam и @QueryParam в той же конечной точке [дубликат]

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

5
задан Paul Samsotha 5 July 2015 в 02:32
поделиться

1 ответ

Взгляните на документацию @QueryParam в отношении допустимых типов для ввода. (То же самое относится ко всем остальным @XxxParam аннотации также)

  1. Быть примитивным типом
  2. Имейте конструктор, который принимает один аргумент String
  3. Имейте статический метод с именем valueOf или fromString, который принимает один аргумент String (см., Например, Integer.valueOf(String))
  4. Имеет зарегистрированную реализацию ParamConverterProvider JAX -RS extension SPI, который возвращает экземпляр 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;
    }
}

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

11
ответ дан Paul Samsotha 19 August 2018 в 07:00
поделиться
  • 1
    Что произойдет, если я получу пользовательский класс со многими полями-членами, у которого есть конструктор, который принимает одну строку, которая является просто пустым конструктором? будет ли он все еще проходить объект этого класса с его состоянием? – Yonatan Nir 12 September 2016 в 07:55
  • 2
    @YonatanNir вам нужно построить класс самостоятельно из этой строки. Даже если это означает, что вам нужно вручную разобрать строку. Если в строке есть что-то вроде структуры JSON, взгляните на самую последнюю ссылку в этом сообщении. Он показывает третий вариант. – Paul Samsotha 12 September 2016 в 07:59
  • 3
    Я понимаю, что мне нужно построить класс со строкой, которая является определением наличия конструктора String. Я спрашиваю, что произойдет, если у меня есть другие члены в этом пользовательском классе, а мой конструктор - просто пустой конструктор, который принимает параметр String. Будут ли значения других членов проходить вместе с объектом? – Yonatan Nir 12 September 2016 в 08:06
  • 4
    По построению я имею в виду, что вам нужно установить все значения самостоятельно. Если вы используете опцию конструктора (а не статическую valueOf), то ваш конструктор Джерси, передающий строковый параметр. Ваша задача - устанавливать значения всех членов. – Paul Samsotha 12 September 2016 в 08:16
  • 5
    @YonatanNir выразился так. Значение параметра запроса - это не что иное, как строка. Джерси не знает, как создать свои настраиваемые типы из этой строки. Но это дает вам некоторые правила, которые вы можете следовать, что позволит Джерси передать вам строку, и вы делаете все, что хотите, для создания объекта – Paul Samsotha 12 September 2016 в 08:20
Другие вопросы по тегам:

Похожие вопросы: