Пропуск URI-переменной 'id', потому что запрос содержит значение связывания с тем же именем - PullRequest
0 голосов
/ 26 апреля 2020

Существует метод PUT, задача которого - сменить карту Customer. Сам класс Customer работает с @ OneToOne отношениями с классом User (поля name, последний name и т. Д. c.). Все работает хорошо, метод выполняет свою задачу и с этим проблем нет. Но почему-то выдает предупреждение:

2020-04-26 14:15:14.160  WARN 5340 --- [nio-8080-exec-2] o.springframework.validation.DataBinder  : Skipping URI variable 'id' because request contains bind value with same name.

Как это исправить?

Я использую Spring-MVC + Hibernate + Jpa + PostgreSQL;

Пользователь класса:

package com.tinychiefdelights.model;

import io.swagger.annotations.ApiModel;
import lombok.Data;

import javax.persistence.*;

@ApiModel
@Data
@Entity
@Table(name = "pg_user", schema = "public")
public class User {

    public User() { // Пустой конструктор для Hibernate

    }

    public User(String name, String lastName, String role,
                String login, String password) { // Базовый конструктор

        this.name = name;
        this.lastName = lastName;
        this.role = role;
        this.login = login;
        this.password = password;
    }


    // Поля
    private @Id
    @GeneratedValue
    Long id;

    @Column(name = "login")
    private String login;

    @Column(name = "password")
    private String password;

    @Column(name = "role")
    private String role;

    @Column(name = "name")
    private String name;

    @Column(name = "last_name")
    private String lastName;
}

Клиент:

package com.tinychiefdelights.model;

import com.fasterxml.jackson.annotation.*;
import lombok.Data;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;

import javax.persistence.*;
import java.util.List;

@Data
@Entity
@Table(name = "customer", schema = "public")
public class Customer {

    public Customer() { // Пустой конструктор для Hibernate

    }


    // Поля

    // name, lastName, login, password берем от класса User через связи;

    private @Id
    @GeneratedValue
    Long id;

    @Column(name = "wallet")
    private double wallet;


    //Relationships
    //
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id", referencedColumnName = "id") // Join without Customer in User class
    @NotFound(action = NotFoundAction.IGNORE)
    private User user;

    //Лист заказов
    @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
    @JsonIgnore // Таким образом я предотвратил рекурсию
    private List<Order> orderList;
}

Сервисная служба:

    public Customer editCustomer(Long id, User user, double wallet){
        Customer customer = customerRepository.getByIdAndUserRole(id, "customer");
        customer.setUser(user);
        customer.setWallet(wallet);
        return customerRepository.save(customer);
    }

Контроллер клиента:

 @PutMapping("/customer/{id}")
    Customer editCustomer(@PathVariable Long id, User user, @RequestParam double wallet) {
        return customerService.editCustomer(id, user, wallet);
    }

1 Ответ

0 голосов
/ 26 апреля 2020

Так как вы передаете пользователя с идентификатором в @PutMapping, а также имеется идентификатор переменной пути. проверьте этот код из атрибута модели Spring MVC:

private void bind(ServletRequest request, ServletRequestDataBinder dataBinder) {
    MutablePropertyValues mpvs = new ServletRequestParameterPropertyValues(request);
    MultipartRequest multipartRequest = WebUtils.getNativeRequest(request, MultipartRequest.class);
    if (multipartRequest != null) {
        bindMultipart(multipartRequest.getMultiFileMap(), mpvs);
    }

    String attr = HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE;
    Map<String, String> uriVars = (Map<String, String>) request.getAttribute(attr);
    if (uriVars != null) {
        for (Map.Entry<String, String> entry : uriVars.entrySet()) {
            if (mpvs.contains(entry.getKey())) {
                logger.warn("Skipping URI variable '" + entry.getKey()
                        + "' since the request contains a bind value with the same name.");
            } else {
                mpvs.addPropertyValue(entry.getKey(), entry.getValue());
            }
        }
    }

    this.extendDataBinder.doExtendBind(mpvs, dataBinder);

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