Я пытаюсь создать приложение, используя SpringBoot, Hibernate и Thymeleaf.
Я хотел бы получить «идентификатор» выбранной службы в списке служб с помощью Thymeleaf, выполнить поиск этой службы в базе данных, а затем направить ее на другую страницу, которая показывает подробную информацию об услуге в соответствии с выбранным элементом списка, однако я получаю следующее сообщение об ошибке:
EL1007E: Property or field 'name' cannot be found on null
По-видимому, я получаю «идентификатор» службы, выбранной в моем списке служб с помощью Thymeleaf. Я не знаю, правильно ли это, но, по крайней мере, выбранный идентификатор службы отображается в URL-адресе страницы "productdetail".
Просмотреть подробности о продукте
<!DOCTYPE html>
<html xmlns:th = "http://www.thymeleaf.org">
<head>
<meta charset = "UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Product Detail</h1>
<p>Name: </p>
<p th:text = "${service.name}"></p>
</body>
</html>
Просмотрите index.html:
<!DOCTYPE html>
<html xmlns:th = "http://www.thymeleaf.org">
<head>
<meta charset = "UTF-8" />
<title>Insert title here</title>
<link rel = "stylesheet" href = "css/style.css" type = "text/css" />
</head>
<body>
<div id = "wrapper">
<header id = "home">
<div id = "serviceGalery">
<div class = "service" th:each = "service : ${services}" >
<p th:text = "${service.name}"></p>
<p th:text = "${service.description}"></p>
<p th:value = "${service.id}" ></p>
<p th:text = "${service.grade}"></p>
<a th:href = "@{/productdetail/{id}(id = ${service.id}) }">Buy</a>
</div>
</div>
</header>
</div>
</body>
</html>
Контроллер
@Controller
public class ServiceController {
@Autowired
private ServiceRepository repository;
@RequestMapping("/")
public String index(Model model) {
Iterable<Service> services = repository.findAll();
model.addAttribute("services", services);
return "index";
}
@RequestMapping(value = "/productdetail/{id}", method = RequestMethod.GET)
public String productDetail(@PathVariable("id") Long serviceId) {
Optional<Service> service = repository.findById(serviceId);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("service", service);
System.out.println("teste: " + serviceId);
return "productdetail";
}
Модель
package com.markus.getachef.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity(name = "servico")
public class Service {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String name;
private String grade;
private String description;
public Service() {
public Service(String name, String grade, String description) {
super();
this.name = name;
this.grade = grade;
this.description = description;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
Репозиторий
package com.markus.getachef.repository;
import org.springframework.data.repository.CrudRepository;
import com.markus.getachef.model.Service;
public interface ServiceRepository extends CrudRepository<Service, Long>{
}
Может кто-нибудь подскажет, как это правильно сделать?




На самом деле вы делаете глупую ошибку в контроллере
@RequestMapping(value = "/productdetail/{id}", method = RequestMethod.GET)
public String productDetail(@PathVariable("id") Long serviceId) {
Optional<Service> service = repository.findById(serviceId);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("service", service);
System.out.println("teste: " + serviceId);
return "productdetail";
}
Вы определяете модель и вид. В соответствии с вашими требованиями ваш контроллер будет выглядеть так:
@RequestMapping(value = "/productdetail/{id}", method = RequestMethod.GET)
public String productDetail(@PathVariable("id") Long serviceId, Model model) {
Service service = repository.getFirstById(serviceId);
model.addAttribute("service", service);
System.out.println("teste: " + serviceId);
return "productdetail";
}
Попробуйте это и дайте ответ, работает он или нет
Avijit, я сделал, как вы мне показали, и ошибка сообщения изменилась. EL1008E: Property or field 'name' cannot be found on object of type 'java.util.Optional' - maybe not public or not valid? Знаете ли вы, в чем проблема с моей необязательной переменной и как ее исправить? Спасибо друг
Похоже, у этого парня была та же проблема, что и у меня. [stackoverflow.com/questions/50904742/… Я пробовал, но не знаю, как применить это решение к моему коду.
@MarkusBranco Я обновил свой ответ. Вы можете попробовать
Avijit, отображается сообщение об ошибке, в котором говорится, что я не могу выполнить трансляцию из Optional <Service> в Service
@MarkusBranco Не могли бы вы выложить ServiceRepository?
Это Woooorks. Большое Вам спасибо. Если у вас есть время, не могли бы вы объяснить мне это изменение? Благодарность
@MarkusBranco docs.spring.io/spring-data/jpa/docs/current/reference/html эта ссылка вам поможет
Я отправил ответ. Проверь это !