Swagger Codegen Resteasy - поймайте ошибки десериализации - PullRequest
0 голосов
/ 30 августа 2018

Я сгенерировал заглушку сервера для моего jax-rs resteasy api и только начал использовать заглушку, пытаясь добавить Stuff в класс MyServiceApiServiceImpl. Я работаю с swagger-codegen v2.3.1.

Сгенерированный код для моей конечной точки выглядит следующим образом:

@RequestScoped
@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaResteasyServerCodegen", date = "2018-08-30T14:30:35.907+02:00")
public class RegelauswertungApiServiceImpl implements RegelauswertungApiService {
      public Response regelauswertung(MatchRequest body,SecurityContext securityContext)
      throws NotFoundException {
      // do some magic!
      return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build();
  }
}

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

Улов по умолчанию для исключения выглядит следующим образом:

com.fasterxml.jackson.databind.JsonMappingException: Unexpected character (',' (code 44)): expected a value at [Source: (io.undertow.servlet.spec.ServletInputStreamImpl); line: 24, column: 30] at [Source: (io.undertow.servlet.spec.ServletInputStreamImpl); line: 24, column: 11] (through reference chain: com.dai.asfopt.service.web.swagger.model.MatchRequest["fahrzeuge"]->java.util.ArrayList[0]->com.dai.asfopt.service.web.swagger.model.Fahrzeug["arbeitsplatzlasten"]->java.util.ArrayList[0])

Есть ли способ перехватить исключения десериализации без изменения чего-либо внутри сгенерированного кода?

1 Ответ

0 голосов
/ 30 августа 2018

Вы можете сделать что-то вроде этого: https://howtodoinjava.com/resteasy/exception-handling-in-jax-rs-resteasy-with-exceptionmapper/

Может быть, этот код поможет:

@Provider
public class GlobalExceptionHandler implements ExceptionMapper<JsonMappingException > {
    @Override
    public Response toResponse(JsonMappingException exception) {
        return Response.status(Status.INTERNAL_SERVER_ERROR)
            .entity("An error deserializing the JSON")
            .type(MediaType.TEXT_PLAIN)
            .build();
    }
}

Вам необходимо создать ExceptionMapper и обработать эту ошибку там. Слой десериализации Джексона размещается перед тем, как вызывается ваш RegelauswertungApiServiceImpl, поэтому вы никогда не сможете обработать эту ошибку внутри этого класса RegelauswertungApiServiceImpl.

...