Validierung der Anforderungsbehörde in Spring WebFlux
Posted: 28 May 2025, 09:43
Wie validieren Sie eine Anforderung DTO in einer reaktiven Spring-Webanwendung? import jakarta.validation.constraints.*;
public class UserSignupRequestDTO {
@NotBlank(message = "Email cannot be blank")
@Email(message = "Email should be valid")
private String email;
@NotBlank(message = "Password cannot be blank")
@Size(min = 8, message = "Password must be at least 8 characters long")
private String password;
}
< /code>
@RestController
public class SignupController {
@PostMapping("/signup")
public ResponseEntity signup(@Valid @RequestBody UserSignupRequestDTO signupRequest) {
// ...
}
}
< /code>
Es ist jedoch keine Option für einen reaktiven Handler: < /p>
@Configuration
public class RouterConfig {
private final TokenHandler tokenHandler;
public RouterConfig(TokenHandler tokenHandler) {
this.tokenHandler = tokenHandler;
}
@Bean
@RouterOperation(beanClass = TokenHandler.class, beanMethod = "signUp")
public RouterFunction signUpRoute() {
return RouterFunctions.route()
.POST("/signup", tokenHandler::signUp)
.build();
}
}
< /code>
// TokenHandler implementation
@Override
public Mono signUp(ServerRequest request) {
return request.bodyToMono(UserSignupRequestDto.class) // this has to be validated
.map(userMapper::toUser)
.map(userService::save)
.map(tokenService::generateTokenFor)
.transform(jwt -> ServerResponse.status(HttpStatus.CREATED).body(jwt, String.class));
}
< /code>
Wie ist die vorgeschlagene Möglichkeit, einen Anforderungsbehörde unter solchen Umständen zu validieren? Ich möchte immer noch Jakartas Validierungsanmerkungen einbeziehen, ohne dass ich offensichtlich irgendein Anmerkennungscode selbst schreibe.
public class UserSignupRequestDTO {
@NotBlank(message = "Email cannot be blank")
@Email(message = "Email should be valid")
private String email;
@NotBlank(message = "Password cannot be blank")
@Size(min = 8, message = "Password must be at least 8 characters long")
private String password;
}
< /code>
@RestController
public class SignupController {
@PostMapping("/signup")
public ResponseEntity signup(@Valid @RequestBody UserSignupRequestDTO signupRequest) {
// ...
}
}
< /code>
Es ist jedoch keine Option für einen reaktiven Handler: < /p>
@Configuration
public class RouterConfig {
private final TokenHandler tokenHandler;
public RouterConfig(TokenHandler tokenHandler) {
this.tokenHandler = tokenHandler;
}
@Bean
@RouterOperation(beanClass = TokenHandler.class, beanMethod = "signUp")
public RouterFunction signUpRoute() {
return RouterFunctions.route()
.POST("/signup", tokenHandler::signUp)
.build();
}
}
< /code>
// TokenHandler implementation
@Override
public Mono signUp(ServerRequest request) {
return request.bodyToMono(UserSignupRequestDto.class) // this has to be validated
.map(userMapper::toUser)
.map(userService::save)
.map(tokenService::generateTokenFor)
.transform(jwt -> ServerResponse.status(HttpStatus.CREATED).body(jwt, String.class));
}
< /code>
Wie ist die vorgeschlagene Möglichkeit, einen Anforderungsbehörde unter solchen Umständen zu validieren? Ich möchte immer noch Jakartas Validierungsanmerkungen einbeziehen, ohne dass ich offensichtlich irgendein Anmerkennungscode selbst schreibe.