Как JaxRS решает между URI, если они дублируются [дубликаты]

Другим случаем, когда NullReferenceExceptions может случиться, является (неправильное) использование оператора as :

class Book {
    public string Name { get; set; }
}
class Car { }

Car mycar = new Car();
Book mybook = mycar as Book;   // Incompatible conversion --> mybook = null

Console.WriteLine(mybook.Name);   // NullReferenceException

Здесь Book и Car являются несовместимыми типами; a Car не может быть преобразован / передан в Book. Когда этот сбой завершается неудачно, as возвращает null. Используя mybook после этого, вы вызываете NullReferenceException.

В общем случае вы должны использовать cast или as, как показано ниже:

Если вы ожидаете преобразования типа в всегда преуспевает (т. е. вы знаете, какой объект должен быть впереди времени), тогда вы должны использовать cast:

ComicBook cb = (ComicBook)specificBook;

Если вы не уверены в типе, но хотите попробовать , чтобы использовать его как определенный тип, затем используйте as:

ComicBook cb = specificBook as ComicBook;
if (cb != null) {
   // ...
}

9
задан Donal Fellows 25 April 2011 в 06:07
поделиться

3 ответа

Возможно, есть две аннотации @Path, которые соответствуют URI. В вашем случае, если сервлет-отображение - service, у вас могут быть @Path("/library") и @Path("library/mynewlibrary"). Когда запрос поступает, пути сопоставления сортируются в порядке убывания, поэтому второй класс должен вызываться, когда приходит запрос с /service/library/mynewlibrary.

4
ответ дан Tarlog 27 August 2018 в 09:55
поделиться

Конечно, возможно иметь два метода с тем же @Path аннотацией, например, если они отличаются другими средствами (например, HTTP-метод или @Consumes аннотация). @Path в классе действует как по умолчанию / root для @Path s методов класса. Более того, это не проблема, если у вас есть один путь, который «внутри» другого; JAX-RS указывает, что используется наиболее подходящее совпадение. (Я предпочитаю не делать этого таким образом, вместо этого «внешний» класс возвращает ссылку на «внутренний» класс на подходящее частичное совпадение, так что каждый путь имеет прослеживаемый путь к ответственности, который определенно ведет к одному классу. Это требует довольно иного способа компоновки аннотаций @Path.)

Но если вы закончили с двумя методами, которые могут обслуживать один и тот же входящий запрос, у вас есть столкновение и JAX Внедрение -RS будет свободно выбирать, какой из них использовать (в зависимости от реализации). Это, вероятно, не то, что вы хотите, поскольку компьютеры, как правило, принимают плохие решения при предоставлении свободного выбора.

1
ответ дан Donal Fellows 27 August 2018 в 09:55
поделиться

Вы можете достичь своей цели: иметь / service / library / mynewlibrary, используя конфигурацию ниже.

В вашем существующем классе у вас есть / service / library, настроенная на уровне класса, чтобы вы могли настроить / обслуживать на уровне класса в новом классе вы добавляете, а затем на уровне метода configure / library / mynewlibrary.

Таким образом, у него не будет одинакового пути для обоих классов, и ваша цель также будет достигнута. Я пробовал это, и он работает.

0
ответ дан Prakash Boda 27 August 2018 в 09:55
поделиться
Другие вопросы по тегам:

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