如何使用Spring MVC和Thymeleaf通过ID搜索OBJ?

问题描述

我正在学习Spring MVC和Thymeleaf,目前我可以创建一个页面来创建OBJ并将其保存在DB中,也可以列出所有obj并将其显示页面上。

我想做的是能够在页面中引入ID和ID,并搜索匹配的ID OBJ并将其显示在屏幕上。

这是我的实体:

@Entity
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
int dni;
String name;
String surname;


public int getDni() {
    return dni;
}
public void setDni(int dni) {
    this.dni = dni;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getSurname() {
    return surname;
}
public void setSurname(String surname) {
    this.surname = surname;
}

这是我的存储库:

package com.demolorenzo.user;

import java.util.List;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends CrudRepository<User,String> {
    List<User>findAll();
    List<User>findByName(String name);
    List<User>findByDni(int dni);
    
}

和我的控制器:

package com.demolorenzo.user;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.modelattribute;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class DemoController {

    @Autowired
    UserRepository userrepo;
    
    
    @GetMapping("/Home")
    public String userForm(Model model) {
        model.addAttribute("user",new User());
        return "Home";
    }
    
    @PostMapping("/Home")
    public String userSubmit(@modelattribute User user,Model model) {
        model.addAttribute("user",user);
        userrepo.save(user);
        return "users";
    }
    
    @GetMapping("/search")
    public String searchForm(Model model) {
        model.addAttribute("user",new User());
        return "search";
    }
    
    @PostMapping("/search")
    public String searchSubmit(@modelattribute User user,userrepo.findByDni(user.getDni()));
        return "users";
    }
    
    
}

这是视图(/搜索):

<form action="#" th:action="@{/search}" th:object="${user}" method="post">

      <p> DNI: <input type="number" th:field="*{dni}"/> </p>

      <p> <input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>   
        
    </form>

和最后一个数据视图(/用户):

<h1>Result</h1>
    <p th:text="'Dni: ' + ${user.dni}" />
    <p th:text="'Name: ' + ${user.name}" />
    <p th:text="'Surname: ' + ${user.surname}" />
    <a href="/Home">Submit another message</a>

这是我得到的错误

org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'dni' cannot be found on object of type 'java.util.ArrayList' - maybe not public or not valid?

解决方法

您的视图正在尝试访问dni对象的user属性:

<p th:text="'Dni: ' + ${user.dni}" />

但是,您正在控制器中执行以下操作:

@PostMapping("/search")
public String searchSubmit(@ModelAttribute User user,Model model) {
    model.addAttribute("user",userrepo.findByDni(user.getDni()));
    return "users";
}

您正在将userrepo.findByDni()方法的结果添加为user。但是该方法返回的是List<User>,而不是单个用户。

因此,视图中的user是显然没有List<User>属性的dni

例如,您可能应该更新控制器方法,以将存储库方法的结果放入变量users中。并使用th:each遍历那些用户。