Как обработать неверную ошибку типа данных в Джерси JAX-RS - PullRequest
0 голосов
/ 05 сентября 2018

Я работаю над API JAX-RS, где пользователь отправляет полезную нагрузку ниже JSON в мой API:

{
    "text": "test search",
    "count": "myvalue"
}

Как упоминалось выше, count имеет тип Integer в POJO SearchDetailsInfo.java, но пользователь отправляет некоторую строку мусора в нем при публикации данных в этот API.

Пожалуйста, найдите мой метод контроллера ниже:

@POST
@Path("/myview")
@Produces(MediaType.APPLICATION_JSON)
public OrderedJSONObject getCatalogView(SearchDetailsInfo criteria,
                @Context ContainerRequestContext containerRequestContext) {
        .... processing ....
}

Так как API несоответствия типов данных получает ошибку ответа, как показано ниже:

Status Code : 400
Status Message : Bad Request
Body:
    Can not construct instance of java.lang.Integer from String value 'myvalue': 
    not a valid Integer value at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@bd8b3db; line: 5, column: 15] 

Из-за несоответствия типов данных Джерси выдает неверный тип данных.

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

Хотелось бы знать, как я могу поймать это исключение, чтобы я мог изменить ответ об ошибке на что-то значимое.

Спасибо.

1 Ответ

0 голосов
/ 11 сентября 2018

Вы можете справиться с этим, внедрив средство отображения ошибок. Для примера, показанного выше, похоже, что исключение выдается при внутренней обработке при отображении данных JSON в POJO.

Если вы внимательно посмотрите журналы, то при обработке данных вы обнаружите ошибки типа InvalidFormatException или JsonMappingException.

Вы можете создать Exception Mapper для получаемой ошибки. Я бы порекомендовал использовать super JsonMappingException, так как он позаботится об ошибке, такой как недопустимый тип, недопустимый JSON в полезной нагрузке запроса и т. Д .:

@Provider
public class GenericExceptionMapper extends Throwable implements ExceptionMapper<JsonMappingException> {
    @Override
    public Response toResponse(JsonMappingException thrExe) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("errorMessage", "Invalid input provided");
        return Response.status(400).entity(jsonObject.toString())
        .type("application/json").build();
    }
}
...