не удалось получить доступ к атрибутам объектов во время реализации тимелина весной - PullRequest
0 голосов
/ 02 июля 2018

Кажется, я не могу получить доступ к атрибутам объектов, переданных в html-файл в тимилеф. Я создаю весеннее веб-приложение REST.

КОД В КОНТРОЛЛЕРЕ

@RequestMapping(value = {"/home/books"}, method = RequestMethod.GET)
    public ModelAndView books()
    {
        ModelAndView modelAndView=new ModelAndView();
        Book book =new Book("name","author","id","54");
        //book.addBook(book("name","author","id","54"));
        List<Book> AllBook =bookService.getAllBooks();
        AllBook.add(book);
        modelAndView.addObject("books",AllBook);
        modelAndView.setViewName("books");
        return modelAndView;
    }

файла books.html в моем шаблоне

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" 
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{default}">
    <head>
        <title>Books</title>
    </head>
    <body>

        <tr th:each="book: ${books}">
            <h1> <td th:text="${book.author}" /></h1>
            <td th:text="${book.name}" />
        </tr>
    </body>
</html>

POJO класс

Public class Book implements Serializable{
    @Id
    private String id;
    private String name;
    private String author;
    private String price;
    private int quantity;

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public Book(String name, String author, String id, String price) {
        super();
        this.name = name;
        this.author = author;
        this.id = id;
        this.price = price;
    }
    public Book()
    {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getId() {
        return id;
    }

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

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }    
}

thee web page dosent показывает значения book.author или book.name. ЭТО должно показать имя, автор. Сама страница отвечает, но значения не отображаются. Эта ошибка отображается Произошла непредвиденная ошибка (тип = Внутренняя ошибка сервера, статус = 500). Исключение при оценке выражения SpringEL: "book.name" (шаблон: "books" - строка 11, столбец 9)

Я допустил какие-либо ошибки, используя тимелиф? пожалуйста помогите

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Определите общедоступные setters и getters в вашем POJO

@Entity
public class Book{
    @Id
    private String id;
    private String name;
    private String author;



    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    private String price;
    private int quantity;

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public Book() {

    }
    public Book(String id, String name, String author, String price, int quantity) {
        super();
        this.id = id;
        this.name = name;
        this.author = author;
        this.price = price;
        this.quantity = quantity;
    }



}

books.html file

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:th="http://www.thymeleaf.org"
    xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
    layout:decorate="~{default}">
<head>
<title>Books</title>
</head>
<body>
    <table>
        <tr th:each="book: ${books}">
            <h1>
                <td th:text="${book.author}"></td>
            </h1>
            <td th:text="${book.name}"></td>
        </tr>
    </table>
</body>
</html>

Bookrepository

public interface Bookrepository extends JpaRepository<Book, String>{    

}

BookService

public interface BookService {

    public List<Book> getALlBooks();

    public void addBook(Book book);
}

Реализация BookService

@Service
public class BookServiceImpl implements BookService {

    @Autowired
    Bookrepository bookrepository;

    @Override
    public List<Book> getALlBooks() {

        return bookrepository.findAll();
    }

    @Override
    public void addBook(Book book) {

        bookrepository.save(book);
    }

}

Ваш контроллер

@Controller("/")
public class BooksController{

    @Autowired
    BookService bookService;

    @RequestMapping(value = "home/books", method = RequestMethod.GET)
    public ModelAndView books() {
        ModelAndView modelAndView = new ModelAndView();
        Book book = new Book("id", "name1", "author1", "54", 5);
        Book book2 = new Book("id 2", "name2", "author2", "54", 4);

        bookService.addBook(book);
        bookService.addBook(book2);

        List<Book> AllBook = bookService.getALlBooks();


        // Check here if list is empty and throw an exception

        modelAndView.addObject("books", AllBook);
        modelAndView.setViewName("books");
        return modelAndView;
    }
}

Объяснение

Ваша первая проблема вызвана тем, что вы не определили setters и getter. У вас были личные поля, и у вас не было доступа к ним за пределами вашего класса.

Ваша вторая проблема вызвана тем, что вы пропустили пустой список. Убедитесь, что проверили свои переменные перед их передачей. Простой logger не сделает тебе ничего плохого. В большинстве случаев это очень удобно.

0 голосов
/ 02 июля 2018

вы уверены, что ваше html-имя файла 'book.html', а не 'books.html'?

Если это book.html, тогда вы должны установить имя представления modelAndView.setViewName("book");

в противном случае измените имя файла на books.html и установите представление как modelAndView.setViewName("books");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...