Как проверить параметр запроса не пуст Строка в параметрах @RequestMapping?

В моем контроллере у меня есть параметр String, содержащий некоторый id, который не должен быть пустым из пустой строки. Мне интересно, есть ли способ проверить, что это не пустая строка в параметрах @RequestMapping? Я попытался решить это в некотором роде

@RequestMapping(value = someURL, params = {"id"})
public SomeResponse doSomething(@RequestParam(required = true) String id)

@RequestMapping(value = someURL, params = {"!id="})
public SomeResponse doSomething(@RequestParam(required = true) String id)

@RequestMapping(value = someURL, params = {"!id=\"\""})
public SomeResponse doSomething(@RequestParam(required = true) String id)

без успеха. Насколько я понимаю, обе params = {"id"} и @RequestParam(required = true) могут только проверять, что параметр id представлен в запросе (!= Null).

Скорее всего, мне нужно проверить, что с кодом в контроллере boby, например

if (id == null || id.isEmpty()) {
    return someErrorResponse;
}

но, пожалуйста, поправьте меня, если я ошибаюсь. Спасибо заранее.

P.S. мое приложение работает на Java 1.7 SE в контейнере Apache Tomcat 7.0.62

Ответ 1

В соответствии с кодом Spring, который использует эту аннотацию

org.springframework.web.servlet.mvc.annotation.ServletAnnotationMappingUtils.checkParameters(String[], HttpServletRequest)

Что-то вроде этого должно работать:

@RequestMapping(value = someURL, params = {"id!="})
public SomeResponse doSomething(@RequestParam(required = true) String id)

Ответ 2

Если вы хотите, чтобы Java EE соответствовал валидации, используйте @Size(min=1).

Hibernate Validator имеет аннотацию @NotEmpty для этой цели. Но это не часть спецификации Java.

BTW, держите required=true, как указано выше, уведомления не будут обеспечивать наличие параметра в запросе.

Реакция EDIT на комментарий:

Spring совместим с Java EE Validation, поэтому аннотация @Size должна работать, если у вас есть некоторый API-интерфейс проверки подлинности Java EE в пути класса. До сих пор я использовал только hibernate validator. Таким образом, вы можете включить эти функции проверки, добавив это в путь к классам:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.2.1.Final</version>
</dependency>

, чем вы можете аннотировать ваш контроллер аннотацией @Validated и сделать это:

@RequestMapping(value = someURL, params = {"id"})
public SomeResponse doSomething(@RequestParam(required = true) @Size(min=1) String id)

Вы также можете настроить сообщение об ошибке, которое будет отправлено клиенту.

Если вы не знакомы с проверкой Java EE, я бы предложил начать изучать его, поскольку это очень важно, если вы создаете конечную точку REST/HTTP. Это откроет для вас новый мир.

Начните с учебника Java EE для проверки

Соответствующая часть Spring doc

Ответ 3

Вы можете использовать defaultValue, как в

@RequestParam(value = "id", required = true, defaultValue = "-1") String id

Но снова вам придется использовать if, если нравится

if(id.equals("-1")){
   return "someErrorPage"
}

В противном случае вы можете создать фильтр для этой цели, как указано в этом примере

Как использовать фильтр сервлета в Java для изменения URL-адреса входящего сервлета?