web-dev-qa-db-ja.com

@RequestMapping paramsでリクエストパラメータが空の文字列ではないことを確認するにはどうすればよいですか?

私のコントローラーには、空の文字列のnullであってはならないidを含むStringパラメーターがあります。私は疑問に思っています、@ RequestMapping paramsの空の文字列ではないことを確認する方法はありますか?私はいくつかの方法でそれを解決しようとしました

_@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;
}
_

間違っている場合は修正してください。前もって感謝します。

追伸私のアプリは、Apache Tomcat 7.0.62コンテナでJava 1.7 SEで実行されています

13
WeGa

その注釈を消費するSpringコードによると

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

このような何かが動作するはずです:

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

Java EE検証に準拠したEEになりたい場合は、@Size(min=1)を使用してください。

Hibernate Validatorには@NotEmptyこの目的のための注釈。しかし、それはJava spec。

ところで、required=true上記の通知は、リクエスト内のパラメータの存在を強制しません。

コメントに対する反応を編集:

SpringはJava EE Validationに準拠しているため、クラスパスにJava EE検証API実装子があれば、@ Sizeアノテーションが機能するはずです。したがって、これをクラスパスに追加することで、これらの検証機能を有効にできます。

<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ドキュメントの関連部分

9
luboskrnac