Ответ Quarkus или Javax с типом not

Одна вещь, которую я ненавижу в Quarkus, заключается в том, что когда вы пытаетесь управлять своим HTTP-ответом, например ResponseEntity, тип Response теряется, и вы можете определить тип, который вы возвращаете, чтобы избежать ошибки разработки. ¿Есть ли способ определить тип и вернуть код ошибки, когда захотите?

Что-то вроде этого кода, мне нравится, можно выбрать тип ответа, а также выбрать статус, который мне нравится.

@POST
@Path("/{storeCode}/schedules")
public Response createHolidaySchedule(@PathParam("storeCode") String storeCode, @QueryParam("day") String day) {
    try {
        HolidaySchedule response = new HolidaySchedule();
        return Response.ok(response).build();
    } catch (Exception e) {
        return Response.status(500).build();
    }
}

person Raúl Garcia    schedule 18.01.2021    source источник
comment
Я решаюсь за себя, но ищу другое решение, не зависящее от собственного кода   -  person Raúl Garcia    schedule 18.01.2021


Ответы (1)


Это дало мне представление о том, что мы можем использовать ExceptionHandler и построить статус ответа с помощью исключения контроллера, создать его с использованием статуса JAX-RS или чего угодно.

@Provider
public class ControllerExceptionHandler implements ExceptionMapper<ControllerException> 
{
    @Override
    public Response toResponse(ControllerException exception) 
    {
        return ControllerException.toResponse(exception);  
    }
}

Поскольку вы можете поймать исключение, которое вы должны сначала выбросить, и до того, как вам понадобится создать, что-то вроде этого:

@POST
@Path("/{storeCode}/schedules")
public HolidaySchedule createHolidaySchedule(@PathParam("storeCode") String storeCode, @QueryParam("day") String day) throws ControllerException {
    try {
        HolidaySchedule response = new HolidaySchedule();
        return response;
    } catch (Exception e) {
        ErrorMessage msg = ErrorMessage.from("Ups not work");
        throw new ControllerException(Status.BAD_REQUEST, msg);
    }
}

ControllerException имеет две статические функции, которые создают ответ JAX-RS или Builder для других модификаций, таких как тип содержимого или что-то еще.

public class ControllerException extends Exception {

    private static final long serialVersionUID = 1L;
    private Status status;
    private Object body;

    public ControllerException(Status status, Object body) {
        this.status = status;
        this.body = body;
    }
    
    public ControllerException(Status status) {
        this(status, null);
    }
    
    public static Response toResponse(ControllerException exception) {
        return ControllerException.toResponseBuilder(exception).build();
    }
    
    public static ResponseBuilder toResponseBuilder(ControllerException exception) {
        return Response.status(exception.status).entity(exception);
    }
}
person Raúl Garcia    schedule 18.01.2021
comment
Вы знаете, что можете сделать так, чтобы исключение расширило исключение WebApplicationException и отправило ответ через конструктор. Таким образом вы можете избежать необходимости в ExceptionMapper. - person Paul Samsotha; 18.01.2021
comment
+100 Пол, я так запутан, потому что у java нет такого исключения, спасибо, чувак! - person Raúl Garcia; 18.01.2021