Как выбрать элемент списка по «ID» с помощью Thymeleaf и перейти на другую страницу с подробностями?

Я пытаюсь создать приложение, используя 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>{

}

Может кто-нибудь подскажет, как это правильно сделать?

Я отправил ответ. Проверь это !

Avijit Barua 17.01.2019 06:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
301
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На самом деле вы делаете глупую ошибку в контроллере

@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? Знаете ли вы, в чем проблема с моей необязательной переменной и как ее исправить? Спасибо друг

Markus Branco 17.01.2019 07:09

Похоже, у этого парня была та же проблема, что и у меня. [stackoverflow.com/questions/50904742/… Я пробовал, но не знаю, как применить это решение к моему коду.

Markus Branco 17.01.2019 07:14

@MarkusBranco Я обновил свой ответ. Вы можете попробовать

Avijit Barua 17.01.2019 07:40

Avijit, отображается сообщение об ошибке, в котором говорится, что я не могу выполнить трансляцию из Optional <Service> в Service

Markus Branco 17.01.2019 07:58

@MarkusBranco Не могли бы вы выложить ServiceRepository?

Avijit Barua 17.01.2019 08:03

Это Woooorks. Большое Вам спасибо. Если у вас есть время, не могли бы вы объяснить мне это изменение? Благодарность

Markus Branco 17.01.2019 08:55

@MarkusBranco docs.spring.io/spring-data/jpa/docs/current/reference/html эта ссылка вам поможет

Avijit Barua 17.01.2019 10:15

Другие вопросы по теме