1. 序章

このチュートリアルでは、SpringMVCでHTTPリクエストパラメーターとパス変数を検証する方法を見ていきます。

具体的には、StringおよびNumberパラメーターをJSR303アノテーションで検証します。

他のタイプの検証については、 Java Bean Validationおよびメソッド制約に関するチュートリアルを参照するか、独自のバリデーターを作成する方法を学習してください。

2. 構成

Java Validation APIを使用するには、hibernate-validatorなどのJSR303実装を追加する必要があります。

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

また、 @Validatedアノテーションを追加して、コントローラーでリクエストパラメーターとパス変数の両方の検証を有効にする必要があります。

@RestController
@RequestMapping("/")
@Validated
public class Controller {
    // ...
}

パラメータ検証を有効にするには、MethodValidationPostProcessorbeanも必要であることに注意してください。 Spring Bootアプリケーションを使用している場合、このbeanは自動構成されます。これは、クラスパスにhibernate-validatorの依存関係があるためです。

それ以外の場合、標準のSpringアプリケーションでは、このBeanを明示的に追加する必要があります。

@EnableWebMvc
@Configuration
@ComponentScan("com.baeldung.spring")
public class ClientWebConfigJava implements WebMvcConfigurer {
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }
    // ...
}

Springでのパスまたは要求の検証中にエラーが発生すると、デフォルトでHTTP500応答が発生します。 このチュートリアルでは、 ControllerAdvice のカスタム実装を使用して、この種のエラーをより読みやすい方法で処理し、不正なリクエストに対してHTTP400を返します。 このソリューションのソースコードは、GitHub。にあります。

3. RequestParamの検証

数値の平日をリクエストパラメーターとしてコントローラーメソッドに渡す例を考えてみましょう。

@GetMapping("/name-for-day")
public String getNameOfDayByNumber(@RequestParam Integer dayOfWeek) {
    // ...
}

私たちの目標は、dayOfWeekの値が1から7の間であることを確認することです。 そのために、@Minおよび@Maxアノテーションを使用します。

@GetMapping("/name-for-day")
public String getNameOfDayByNumber(@RequestParam @Min(1) @Max(7) Integer dayOfWeek) {
    // ...
}

これらの条件に一致しないリクエストは、デフォルトのエラーメッセージとともにHTTPステータス400を返します。

たとえば、 http:// localhost:8080 / name-for-day?dayOfWeek = 24 を呼び出すと、応答メッセージは次のようになります。

getNameOfDayByNumber.dayOfWeek: must be less than or equal to 7

カスタムメッセージを追加することで、デフォルトのメッセージを変更できます。

@Max(value = 1, message = “day number has to be less than or equal to 7”)

4. PathVariableの検証

@ RequestParam、と同様に、 javax.validation.constraints パッケージの任意のアノテーションを使用して、@PathVariableを検証できます。

文字列パラメータが空白ではなく、長さが10以下であることを検証する例を考えてみましょう。

@GetMapping("/valid-name/{name}")
public void createUsername(@PathVariable("name") @NotBlank @Size(max = 10) String username) {
    // ...
}

たとえば、 name パラメータが10文字を超えるリクエストは、次のメッセージを含むHTTP400エラーになります。

createUser.name:size must be between 0 and 10

@Size アノテーションでメッセージパラメーターを設定することにより、デフォルトのメッセージを簡単に上書きできます。

5. 結論

この記事では、Springアプリケーションでリクエストパラメータとパス変数の両方を検証する方法を学びました。

いつものように、すべてのソースコードはGitHubで入手できます。