Ошибка выполнения после преобразования проекта микронавта в сервлет микронавта

Я пытаюсь использовать API сервлета Micronaut для существующего микросервиса. Без API сервлета следующее работало отлично

 @Test
  public void
  saved_movies_are_returned_in_my_list() {
    try (RxHttpClient client = embeddedServer.getApplicationContext()
        .createBean(RxHttpClient.class, embeddedServer.getURL())) {
      Movie movie = createMovie();
      Response<Movie> response = client.toBlocking().retrieve(
          HttpRequest.POST("/movies", movie).bearerAuth(idToken),
          Argument.of(Response.class, Movie.class));
      Response<List<Movie>> myMovies = client.toBlocking().retrieve(
          HttpRequest.GET("/movies").bearerAuth(idToken),
          Argument.of(Response.class, Argument.listOf(Movie.class)));
      assertThat(myMovies.data).contains(movie);
    }

  }

Это контроллер

@Post("/")
  public Response<Movie> save(Movie movie) {
    return movieService.save(movie);
  }

И у службы есть логика, при которой, если отображение пользователя<->фильм уже существует, данные не сохраняются и возвращается существующее отображение.

public Response<Movie> save(Movie movie) {
    Optional<Movie> byUserIdAndTmdbId = movieRepository
        .findByUserIdAndTmdbId(movie.getUserId(), movie.getTmdbId());
    Response<Movie> movieResponse = null;
    if (!byUserIdAndTmdbId.isPresent()) {
      movieResponse = new Response<>("Movie Saved Successfully",
          State.SUCCESS, movieRepository.save(movie));
      return movieResponse;
    } else {
      return new Response<>("Movie already in list",
          State.SUCCESS, byUserIdAndTmdbId.get());
    }
  }

Репозиторий тоже довольно простой

@Repository
public interface MovieRepository extends CrudRepository<Movie,Long> {
  List<Movie> findByUserId(String userId);
  Optional<Movie> getByUserIdAndTmdbId(String userId, Long timdbId);
}

Все это прекрасно работает, пока я не удалю

implementation "io.micronaut:micronaut-http-server-netty"

и замените его на implementation("io.micronaut.servlet:micronaut-http-server-jetty:1.0.0.M1")

После этого изменения я получаю следующее исключение

Failed to convert argument [Movie] for value [io.micronaut.core.convert.value.ConvertibleValuesMap@17bae1ca] due to: Cannot convert an iterable with more than 1 value to a non collection object
io.micronaut.http.client.exceptions.HttpClientResponseException: Failed to convert argument [Movie] for value [io.micronaut.core.convert.value.ConvertibleValuesMap@17bae1ca] due to: Cannot convert an iterable with more than 1 value to a non collection object
    at io.micronaut.http.client.DefaultHttpClient$10.channelRead0(DefaultHttpClient.java:1831)

И если я попытаюсь сохранить обе зависимости, я получу дублирующееся исключение bean для инъекции HTTPClient!

1 ответ

Добавить @Body аннотация к методу контроллера:

      public Response<Movie> save(@Body Movie movie)

Реализация по умолчанию (среда выполнения Netty) не требует аннотации, и поэтому она работает для netty, но если вы используете механизм / реализацию сервлета (причал или tomcat и т. Д.), Тогда аннотация необходима.

См .: https://github.com/micronaut-projects/micronaut-servlet/issues/243

Другие вопросы по тегам