10

私のコントローラには、空の文字列のnullであってはならない、いくつかのIDを含むStringパラメータがあります。私はそれが空ではないことを確認する方法はありますか?@RequestMappingパラメータの文字列ですか? 私はいくつかの方法でそれを解決しようとしました。要求パラメータをチェックする方法は空ではありません@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)で表示されているかどうかだけを確認できます。

私が

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

のように、コントローラBOBYのコードでそれを確認する必要がありますが、私は間違っているなら、私を修正してください可能性が最も高いです。 ありがとうございます。

P.S.私のアプリはApache Tomcat 7.0.62コンテナのJava 1.7 SEで動作しています

答えて

6

を与えられるように、このような何か作業をする必要があります:返信用

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

私は、ヘッダーフィールドを除外したときにステータス400が得られたので、 'required = true'は必要ではないことに気付きました: '{" status ":400、" error ":" Bad Request "、" exception " org.springframework.web.bind.ServletRequestBindingException "、" message ":"文字列型のメソッドパラメータのリクエストヘッダー 'X-Custom-Header'が見つかりません "、" path ":"/api/"} ' – user3105453

+0

ありがとうございました。これが私の必要なものです。私があなたが提案した方法で注釈を定義したとき、コントローラメソッドの始めにブレークポイントを置き、テストを実行しました。私はコントローラメソッドには入っていませんでした。 b)自己説明例外org.springframework.web.bind.UnsatisfiedServletRequestParameterExceptionが発生しました:パラメータ条件 "id!="が実際の要求パラメータに対して満たされていない:id = {} – WeGa

7

Java EEに妥当性検査を行いたい場合は、@Size(min=1)を使用してください。

Hibernate Validatorは、この目的のために@NotEmptyアノテーションを持っています。しかし、それはJava仕様の一部ではありません。

続きを読むrequired=true上記の通知は、要求に応じてparamの存在を強制しません。コメント

EDIT反応:

春あなたがクラスパス上のいくつかのJava EE検証APIのimplmentorを持っている場合は、Java EEの検証に準拠し、そう@size注釈が動作するはずです。これまでは、私はhibernateバリデーターのみを使用していました。あなたはまた、意志のエラーメッセージをカスタマイズすることができ

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

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

あなたは@Validated注釈を使用して、コントローラに注釈を付けると、これを行うことができるより:だから、あなたはクラスパスにこれを追加することにより、これらの検証機能を有効にすることができますクライアントに送信されます。

Java EEの検証に精通していない場合は、REST/HTTPエンドポイントを作成する場合には非常に重要であるため、調査を開始することをお勧めします。あなたのために新しい世界が開かれます。

Start with Java EE Tutorial for validation

Relevant part of Spring doc

+0

感謝を。私は自分の投稿に環境記述を追加しています。あなたが提供しているソリューションと互換性があるかどうかはわかりません。入力パラメータがこれらの注釈の制約に違反した場合、どうなりますか教えてください。そのような状況にどう対応すべきですか? – WeGa

-4

あなたは

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

のようにdefaultValueを使用することができます。しかし、再び、あなたは

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

のようなそうでない場合は、作成することができます使用する必要がありますこの手袋のためのフィルター大証、注釈

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

ことを消費春のコードによると、この例では

How to use a servlet filter in Java to change an incoming servlet request url?

+0

あまり役に立ちません... –

+0

返信ありがとうございます。しかし、私の手作業によるパラメータチェックは、あなたのソリューションよりも優れていませんか? – WeGa

+0

「あまり役に立たない」だけでなく、間違っている。 'defaultValue'は、パラメータが指定されていない場合にのみ使用され、"空白だった "シナリオはカバーしません。 – kryger

関連する問題