【问题标题】:Spring MVC: Update an existing entitySpring MVC:更新现有实体
【发布时间】:2020-05-20 13:46:48
【问题描述】:

实体类

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @NotNull
    private String firstName;
    @NotNull
    private String lastName;
    @NotNull
    @Email
    private String email;
    private String country;
    private String state;
    private String roles;
    private String permissions;
    @NotNull
    @Size(min=6)
    private String password;
    private String telNumber;


    public User() {
    }
    public User(String firstName,String lastName,String email,String roles,String permissions,String password) {
    this.firstName=firstName;
    this.lastName=lastName;
    this.email=email;
    this.roles=roles;
    this.permissions=permissions;
    this.password=password;
    }
    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country= country;
    }

    public String getState() {
        return state;
    }

    public void setMesto(String state) {
        this.state= state;
    }
    public String getRoles() {
        return roles;
    }

    public List<String> getRolesList(){
        if(this.roles.length()>0){
            return Arrays.asList(this.roles.split(","));
        }
        return new ArrayList<>();
    }
    public List<String> getPermissionsLisst(){
        if(this.permissions.length()>0){
            return Arrays.asList(this.permissions.split(","));
        }
        return new ArrayList<>();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }


    public void setRoles(String roles) {
        this.roles = roles;
    }


    public void setPermissions(String permissions) {
        this.permissions = permissions;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getTelNumber() {
        return telNumber;
    }

    public void setTelNumber(String telNumber) {
        this.telNumber = telNumber;
    }

这是我的看法

    <div class="udaje container mx-auto text-dark">
<form th:action="@{/admin/useractions}" th:object="${user}" method="post">
    <div class="form-group">
        <label for="firstName" class="form-control-label">First Name</label> <input
            type="text" class="form-control" th:field="*{firstName}" id="firstName" />
        <div class="text text-danger" th:if="${#fields.hasErrors('firstName')}"
             th:errors="*{firstName}"></div>
    </div>
    <div class="form-group">
        <label for="lastName" class="form-control-label">Last Name</label> <input
            type="text" class="form-control" th:field="*{lastName}" id="lastName" />
        <div class="text text-danger" th:if="${#fields.hasErrors('lastName')}"
             th:errors="*{lastName}"></div>
    </div>
    <div class="form-group">
        <label for="email" class="form-control-label">Email</label> <input
            type="text" class="form-control" th:field="*{email}" id="email" />
        <div class="text text-danger" th:if="${#fields.hasErrors('email')}"
             th:errors="*{email}"></div>
    </div>
    <div class="form-group">
        <label class="form-control-label">State</label><input
            type="text" class="form-control" th:field="*{state}" id="state" />
        <div class="text text-danger" th:if="${#fields.hasErrors('state')}"
             th:errors="*{state}"></div>
    </div>
    <div class="form-group">
        <label for="country" class="form-control-label">Country</label> <input
            type="text" class="form-control" th:field="*{mesto}" id="country" />
        <div class="text text-danger" th:if="${#fields.hasErrors('country')}"
             th:errors="*{country}"></div>
    </div>

    <div class="form-group">
        <label for="password" class="form-control-label">Password</label> <input
            type="password" class="form-control" th:field="*{password}" id="password" />
        <div class="text text-danger" th:if="${#fields.hasErrors('password')}"
             th:errors="*{password}"></div>
    </div>
    <div class="text-center">
        <input type="submit" value="Submit" class="btn btn-dark" />
    </div>

</form>

控制器

@Controller
public class UserController {
    @Autowired
    private UserServices userServices;
    private UserRepository userRepository;
    public int roh;
    @GetMapping("/admin/userlist")
    public String userList(Model model,@RequestParam(defaultValue = "") String email){
        model.addAttribute("users",userServices.findByEmailLike(email));
        return "/admin/userlist";
    }
    @RequestMapping("/admin/useractions")
    public String userActions(@RequestParam(value = "id", required = true) Integer id, Model model){
        model.addAttribute("user",userServices.findOne(id));
        return "/admin/useractions";
    }
@PutMapping("/admin/useractions")
public User updateUser(@RequestBody User user) {
    return userServices.update(user);
}

}

您好,我正在寻找使用 jpa 存储库更新用户的方法.. 我尝试了很多方法,我在 1/2 的情况下浏览了互联网,它收到错误 id is not present(就像这种方式一样

public User update(User user){
        return userRepository.save(user);
    }

), 或者它不是更新用户,而是创建一个新用户.. 我也在使用 PasswordEncoder,当我想在密码字段中打印用户密码时,它只是空的,是否可以在字段中输入 *** 之类的密码? 感谢您的帮助

【问题讨论】:

    标签: java spring spring-mvc jpa


    【解决方案1】:

    它正在创建新的,而不是更新,因为您没有从表单中发送id 的用户。存储库在后台检查,如果 id 存在,则使用 id 更新记录,否则创建新记录。

    只需将 id 作为视图中的隐藏字段发送,然后它应该更新记录。

    <input type="hidden" th:field="${id}" />
    

    【讨论】:

    • 放在哪里?
    • 目前我拥有它,我得到了这个错误参数'id' is not present|400
    【解决方案2】:

    你的代码有各种错误和误解:

    将其更改为:

    @Controller
    public class UserController {
    
        @Autowired
        private UserServices userServices;
    
        @GetMapping("/admin/userlist")
        public String userList(Model model,@RequestParam(defaultValue = "") String email){
            model.addAttribute("users",userServices.findByEmailLike(email));
            return "/admin/userlist";
        }
    
        @GetMapping("/admin/useractions")
        public String userActions(){
            return "/admin/useractions";
        }
    
        @PostMapping("/admin/useractions")
        public String updateUser(@ModelAttribute User user) {
            userServices.update(user);
    
            return "/theNextView";
        }
    
        @ModelAttribute("user")
        public User getUser(@RequestParam(value = "id", required = false) Integer id) {
            return id !=null ? userServices.findOne(id) : new User();
        }
    }
    

    并在您的编辑表单中添加:

    &lt;input type="hidden" name="id" value="${user.id}" /&gt;

    如果 requestParam id 设置为 URL 参数或隐藏字段,则 GET 和 POST getUser(...) 将使用现有用户填充模型。

    在后一种情况下,这个现有用户将被传递给 POST 处理程序,并且提交的表单数据将绑定到这个现有实例。

    【讨论】:

    • 我也想知道如何在密码字段中输入 ****** 和密码值?
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 2011-12-19
    • 2019-02-09
    相关资源
    最近更新 更多