/ / @RestController: Sprawdź poprawność @ResponseBody (nie @RequestBody) - spring, spring-mvc

@RestController: Sprawdź poprawność @ResponseBody (nie @RequestBody) - sprężyna, spring-mvc

Jak mogę osiągnąć, że @ResponseBody (w moimprzypadku klasy typu SomePojoInterface) jest automatycznie sprawdzana (powiedzmy przez walidację JSR-303). Miło by było, gdyby w przypadku błędu sprawdzania poprawności przewodnik mógł rzucić Exception które można obsłużyć w niektórych @ControllerAdvice opatrzona komentarzem.

Mój kod do tej pory.

@RestController
public class MyRestController {

@GetMapping(value = "validate", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
protected SomePojo validateResponse() {
return new SomePojo();
}
}

@ControllerAdvice
class GlobalControllerExceptionHandler {

@ResponseStatus(HttpStatus.XXX)
@ExceptionHandler(MyResponseValidationException.class)
public void handleResponseValidationException() {
// ...
}
}

public class SomePojo implements SomePojoInterface {

@NotNull
private String someValue;

// getter / setter
}

Odpowiedzi:

0 dla odpowiedzi № 1

Jeśli masz przypisaną klasę SomePojo, to:

     @GetMapping(value = "validate", produces = MediaType.APPLICATION_JSON_VALUE)
protected SomePojo validateResponse() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

SomePojo somePojo = new SomePojo(null);

Set<ConstraintViolation<Car>> constraintViolations = validator.validate(somePojo);
// Other stuff
}

@Valid adnotacja jest dla zapytania. Więcej przykładów z ich docs. Nie jestem pewien, co chcesz sprawdzić


0 dla odpowiedzi nr 2

Udało mi się to osiągnąć poprzez @RestControllerAdvice.

@RestControllerAdvice
public class RestPostProcessingAdvice implements ResponseBodyAdvice<SomePojoInterface> {

@Inject
private Validator validator;

@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
if(doSomeChecksIfEligiable(returnType, converterType)) {
return true;
}
return false;
}

@Override
public SomePojoInterface beforeBodyWrite(SomePojoInterface body, MethodParameter returnType,
MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response) {
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(body);
if(constraintViolations.size() > 0) {
response.setStatusCode(HttpStatus.XXX);
LOG.fatal("Sorry, I"m sending crap");
}

return body;
}
}

Pamiętaj, że rzucanie Exception i łapanie go w @ExceptionHandler to jest wysyłanie tego samego (mofified) obiektu w @ResponseBody może doprowadzić do niekończącej się pętli, ponieważ obiekt zostanie ponownie sprawdzony @RestControllerAdvice.