При передаче enum в REST-контроллере, я получаю java.lang.IllegalArgumentException, в то время как я использую enum в качестве строки - PullRequest
0 голосов
/ 23 декабря 2018

Контроллер: -

@RequestMapping(value="/CreateMovie", method= RequestMethod.POST)
    public HttpStatus createMovie(@RequestBody JSONObject object) {
        Movie movie =new Movie(object.optString("name"),
                    MovieType.valueOf(object.optString("type")),
                    new Date(object.optString("releasedate")),
                    Integer.parseInt(object.optString("time")), 
                    Genre.valueOf(object.optString("genre")));
            //object.

    repository.save(movie);

    return HttpStatus.OK;

}

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

@Entity(name="Movie")
public class Movie {


    public Movie()
    {

    }
    public Movie(String name,MovieType type,Date releasedate,
          int movie_length, Genre genre)
    {
        this.name=name;
        this.type=type;
        this.releasedate=releasedate;
        this.movie_length=movie_length;
        this.genre=genre;
    }

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name="Id")
    private long id;

    @Column(name="movie_name")
    @NotNull
    String name;
    @Enumerated(EnumType.STRING)
    //@NotNull
    MovieType type;
    @Column(name="release_date")
    @JsonFormat(shape=STRING, pattern="dd-MM-yyyy")
    //@NotNull
    Date releasedate;
    @Column(name="movie_length")
    //@NotNull
    int movie_length;
    @Column(name="like_percentage")
    float likepercentage;
    @Column(name="no_of_reactions")
    float no_of_reactions;
    @Column(name="avg_rating")
    float avg_rating;
    @Column(name="no_of_reviews")
    int no_of_reviews;
    @Column(name="director")
    @NotNull
    String director;
    @Transient
    List<String> cities;
    @Transient
    List<String> cast;

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

public enum MovieType {

    Hindi("Hindi"),
    English("English"),
    Telugu("Telugu"),
    Malyalam("Malyalam"),
    Kannada("Kannnada");

    private String name;

    public String getName() {
        return name;
    }

    MovieType(String name) {
        this.name = name;
    }


}

Трассировка стека выглядит следующим образом: -

Servlet.service () для сервлета [dispatcherServlet] в контексте с путем [] вызвало исключение [Ошибка обработки запроса;вложенное исключение: java.lang.IllegalArgumentException: без константы перечисления com.example.Model.MovieType.] с основной причиной

1 Ответ

0 голосов
/ 23 декабря 2018

Вот так должен выглядеть ваш контроллер (работает следующий код):

@GetMapping(path = "/movies")
public Movie getMovie() {
    Movie movie = new Movie("name", MovieType.English, new Date(), 1, Genre.Action);
    return movie;
}

@PostMapping(path = "/movies")
public HttpStatus createMovie(@RequestBody Movie movie) {
    repository.save(movie);
    return HttpStatus.OK;
}

Объект фильма:

public class Movie {

    public String name;
    public Date releasedate;
    public MovieType type;
    public int movie_length;
    public Genre genre;

    public Movie() {}

    public Movie(String name, MovieType type, Date releasedate, int movie_length, Genre genre) {
        this.name = name;
        this.type = type;
        this.releasedate = releasedate;
        this.movie_length = movie_length;
        this.genre = genre;
    }
}

MovieType:

public enum MovieType {
    Hindi("Hindi"), English("English"), Telugu("Telugu"), Malyalam("Malyalam"), Kannada("Kannnada");

    private String name;

    public String getName() {
        return name;
    }

    MovieType(String name) {
        this.name = name;
    }
}

Жанр:

public enum Genre {
    Daram("Drama"), Action("Action");

    private String name;

    public String getName() {
        return name;
    }

    Genre(String name) {
        this.name = name;
    }
}

Примечания:

  • Передавать фильм как объект - не используйтеJsonObject для анализа json
  • Используйте URL-соглашения, как указано выше (т. Е. Фильмы как для GET, так и для POST)
  • Получите объект фильма с помощью getMovie () и используйте егошаблон для отправки аналогичного объекта в createMovie () с POST.
  • Используйте Почтальон или любой другой клиент Rest для проверки вашего кода

Пример запроса POST:

{
    "name": "name",
    "releasedate": "2018-12-23T10:01:47.056+0000",
    "type": "English",
    "movie_length": 1,
    "genre": "Action"
}

Убедитесь, что вы отправили тело запроса в формате JSON: enter image description here

Goodluck

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...