errores de creación de haba para la solicitud de los granos de ámbito

metacubed:

Cuando un grano de primavera se anota con SCOPE_REQUEST, se crea y se destruye cada vez que una petición HTTP es recibida por el servlet. Si esta creación frijol falla, un error del servidor se envía de nuevo a la persona que llama.

En este ejemplo trivial, la creación de la MyInputshaba depende de los contenidos de la petición HTTP.

@Configuration
class ApplicationConfiguration {

    @Bean
    @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public MyInputs myInputs(HttpServletRequest request) {

        String header1 = request.getHeader("header1");
        if (header1 == null) {
            throw new MyException("header1 is missing");
        }
        return new MyInputs(header1);
    }
}

Si la solicitud HTTP no contiene un encabezado necesario, una BeanCreationExceptionserá lanzada. Esto se traduce en una respuesta inútil "500 Error interno del servidor".

Me gustaría devolver un código de respuesta más fácil de usar y el cuerpo, por ejemplo, un "400 Bad Request" con un mensaje de ayuda. ¿Cómo se personaliza esta traducción respuesta? No puedo encontrar ningún gancho del ciclo de vida que permitan esto.


Nota: Esta es la forma en que se consume el grano de petición con ámbito de:

@RestController
public class MyController {

    private final Provider<MyInputs> myInputsProvider;

    @Autowired
    public MyController(Provider<MyInputs> myInputsProvider) {

        this.myInputsProvider = myInputsProvider;
    }

    @GetMapping("/do-stuff")
    public void doStuff() {

        // Get the inputs for the current request
        MyInputs myInputs = myInputsProvider.get();

        // ...
    }
}
Jonathan JOhx:

Puede utilizar @ControllerAdvicela anotación con el fin de controlar las excepciones después se tiran.

También es necesario utilizar @ExceptionHandlercon el fin de controlar la excepción.

@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MyException.class)
    public final ResponseEntity<CustomError> handleException(MyException ex, WebRequest request) {
        CustomError error = new CustomError();            
        error.setMessage(ex.getMessage());
        error.setStatus(HttpStatus.BAD_REQUEST);
        return new ResponseEntity<>(error, null, HttpStatus.BAD_REQUEST);
    }
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=230052&siteId=1
Recomendado
Clasificación