SpringBootで半角数字バリデーション

SpringBootで半角数字バリデーション

SpringBootで半角数字のバリデーションを実装する方法について説明します。
以下の手順で、入力された値が半角数字であるかどうかを検証するバリデーションを設定することができます。

1. バリデーションの依存関係を追加

まず、pom.xml(Mavenを使用している場合)にバリデーションの依存関係を追加します。
spring-boot-starter-validationは、Bean Validationをサポートするライブラリです。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2. バリデーションアノテーションの作成

次に、半角数字のバリデーションを行うカスタムアノテーションを作成します。
以下は、@HalfWidthNumberというアノテーションを定義する例です。

HalfWidthNumber.java(アノテーション)
package com.example.validation;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Constraint(validatedBy = HalfWidthNumberValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface HalfWidthNumber {
  String message() default "Input must be half-width numbers";
  Class<?>[] groups() default {};
  Class<? extends Payload>[] payload() default {};
}
HalfWidthNumberValidator.java(バリデータ)

次に、アノテーションに対応するバリデータクラスを作成します。
ここで、入力値が半角数字であるかどうかをチェックします。

package com.example.validation;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class HalfWidthNumberValidator implements ConstraintValidator<HalfWidthNumber, String> {

  @Override
  public void initialize(HalfWidthNumber constraintAnnotation) {
  }

  @Override
  public boolean isValid(String value, ConstraintValidatorContext context) {
    if (value == null) {
      return true; // or false based on your requirement
    }
    return value.matches("^[0-9]+$"); // 正規表現で半角数字をチェック
  }
}

3. バリデーションを適用する

次に、モデルクラスやDTOに対して、カスタムバリデーションアノテーションを適用します。

UserDto.java(DTO)
package com.example.dto;

import com.example.validation.HalfWidthNumber;

public class UserDto {

  @HalfWidthNumber
  private String numericField;

  // getters and setters
}

4. バリデーションエラーの処理

バリデーションエラーが発生した場合の処理は、通常、@RestControllerAdviceを使用して行います。
これにより、エラーメッセージをクライアントに返すことができます。

GlobalExceptionHandler.java
package com.example.exception;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.validation.FieldError;

@RestControllerAdvice
public class GlobalExceptionHandler {

  @ExceptionHandler(MethodArgumentNotValidException.class)
  public ResponseEntity<?> handleValidationExceptions(MethodArgumentNotValidException ex) {
    var errors = ex.getBindingResult().getAllErrors();
    var errorMessages = errors.stream()
      .map(error -> ((FieldError) error).getField() + ": " + error.getDefaultMessage())
      .toArray(String[]::new);

    return new ResponseEntity<>(errorMessages, HttpStatus.BAD_REQUEST);
  }
}

まとめ

以上で、SpringBootを使用して半角数字のバリデーションを実装する方法を説明しました。
カスタムアノテーションとバリデータを作成し、DTOやモデルに適用することで、ユーザーの入力を正しく検証できます。
バリデーションエラーが発生した場合には、適切にエラーメッセージを処理してクライアントに返すようにします。