@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/greeting/{name}")
public Uni<String> greeting(String name, @QueryParam("limit") int limit) {
return service.greeting(name.toString());
}
localhost:8080/greeting/someName?limit=454 -- возвращает 200, как и ожидалось. localhost:8080/greeting/someName?limit=dfg -- возвращает 404 вместо 400
В приложении Quarkus конечная точка возвращает неправильный код ошибки (404 вместо 400).
Но в нереактивном приложении Spring boot это работает нормально (возвращает 400)





Я думаю, что quarkus решил рассматривать это как ошибку 404, потому что он ожидает метод со следующей сигнатурой:
public Uni<String> greeting(String name, @QueryParam("limit") String limit) {
...
}
и не находит.
Один из способов решить ваш вариант использования — прочитать предел в виде строки, а затем преобразовать его в целое число:
// Convert a NumberFormatException error into a 400 status code response
@ServerExceptionMapper
public RestResponse<String> mapException(NumberFormatException x) {
return RestResponse.status(Response.Status.BAD_REQUEST, "Unknown limit: " + x.getMessage());
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/greeting/{name}")
public Uni<String> greeting(String name, @QueryParam("limit") String limit) {
// Throws NumberFormatException if the limit is not a number
int limitAsInt = Integer.parseInt( limit );
return service.greeting(name.toString());
}
Ошибки преобразования параметров запроса обрабатываются как 404 (а не как 400, как ожидалось), как для спецификации (https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest3x/jaxrs-resources.html# d0e2052).
Что, если вы измените
limitна строку и проанализируете эту строку в своем коде? Похоже, что Quarkus поступает правильно — нет ресурса, который принимает String, только тот, который принимает int.