У меня есть метод обновления для обновления mov ie. Но когда я даю данные в почтальоне, я ввожу одно поле, а остальные поля получают нулевое значение - PullRequest
0 голосов
/ 10 января 2020

Это список фильмов.

    public static List<Movie> movies;

    static {
        movies = new ArrayList<>();
        movies.add(new Movie(1, "Fprd vs Ferrari", "Movie on Racing", "abcd", "xyz"));
        movies.add(new Movie(2, "F2", "Comedy Movie", "Venkatesh", "Tamanna"));
        movies.add(new Movie(3, "Titanic", "Movie", "Hero", "Heroine"));
           }

это метод обновления:

public Result update(Http.Request request, int id) {
        Movie movie = findById(id);
        if (movie == null) {
            return notFound("Movie not Found");
        }
        JsonNode jsonNode = request.body().asJson();
        Movie movie1 = Json.fromJson(jsonNode, Movie.class);
        movie1.setId(id);
        int index = movies.indexOf(movie);
        movies.set(index, movie1);
        return ok(Json.toJson(movie1));
    }

Когда я отправляю данные с помощью почтальона, пример я приведу только movieName, а затем mov ie обновится, но остальные поля получат нулевое значение.

Но я хочу обновить данные. Если я не отправил поле, оно будет сохранено с существующим значением из объекта.

Как можно Я делаю это .. каково условие для этого

Ответы [ 2 ]

1 голос
/ 10 января 2020

В качестве напоминания: в RESTful-дизайне есть два похожих метода: PUT, который обновляет вашу сущность в соответствии с точно передаваемыми значениями (включая нули, как ваша текущая реализация), и PATCH, что обновляет только не имеющие значения поля.

[лучше объяснено: https://medium.com/backticks-tildes/restful-api-design-put-vs-patch-4a061aa3ed0b]

Поэтому мой подход будет реализовывать два варианта:

public Result put(Http.Request request, int id) {
   return update(request,id,true);
}
public Result patch(Http.Request request, int id) {
   return update(request,id,false);
}
private Result update(Http.Request request, int id, boolean forceUpdate) {
        Movie existing = findById(id);
        if (existing == null) {
            return notFound("Movie not Found");
        }
        JsonNode jsonNode = request.body().asJson();
        Movie received = Json.fromJson(jsonNode, Movie.class);

        if (forceUpdate || received.getMovieName() != null) {
           existing.setMovieName(received.getMovieName());
        }
        // same for the rest of fields in Movie. You may want to use reflection
        // instead of writing the same for each field manually
        ...

        return ok(Json.toJson(existing));
    }
0 голосов
/ 10 января 2020

На самом деле, ваш запрос содержит только movieName. И вы не обновляете это имя объектом mov ie. Вы должны обновить все значения объекта movie1 до объекта mov ie, тогда будет получено следующее обновление.

public Result update(Http.Request request, int id) {
        Movie movie = findById(id);
        if (movie == null) {
            return notFound("Movie not Found");
        }
        JsonNode jsonNode = request.body().asJson();
        Movie movie1 = Json.fromJson(jsonNode, Movie.class);
        movie.setMovieName(movie1.getMovieName()); 
        int index = movies.indexOf(movie);
        movies.set(index, movie);
        return ok(Json.toJson(movie));
    }
...