问题描述
我正在学习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
遍历那些用户。