Displaying JPA Entity table data to thymeleaf view

1.5k views Asked by At

I have a JPA Entity table with id and name column. I want to display the name values to the thymeleaf view. Right now I am able to see the Entity object in the view but not the column values for name. Here's how I created the table and defined getters and setters:

@Entity
@Table(name = "Book")
public class Book extends AbstractPersistable<Long> {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;

@Column(name = "name")
private String name;

public Long getID() {
    return this.id;
}

public String getContent() {
    return this.name;
}

public void setID (Long id) {
    this.id = id;
}

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

From the controller this is how I am trying to set the content:

@Controller
@RequestMapping("/")
public class BookController {

@Autowired
private BookRepository bookRepository;

@RequestMapping("/addBook")
@ResponseBody
public String addBook(@RequestParam("name") String name) {
    Book book = new Book();

    book.setContent(name);
    bookRepository.save(book);
    return name;

}

@RequestMapping(value = "book", method = RequestMethod.GET)
    public String books(Model model) {
    model.addAttribute("books", bookRepository.findAll());
    return "book";
    } 

}

The thymeleaf view template:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" 
  xmlns:th="http://www.thymeleaf.org"      
  xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3"
  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
    <head lang="en">
        <meta charset="UTF-8" />
        <title>Books</title>
    </head>
    <body>
        <h1>Books Database</h1>
        <ul th:each="book : ${books}">
            <li th:text="${book.name}"></li>
        </ul>                
    </body>
</html>

When I add new books from the addBook page and visit the book page to see the book names then I get this error:

Exception evaluating SpringEL expression: "book.name". In the IDE console the error found as: org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'name' cannot be found on object of type 'sec.book.BookNames.

What could be wrong?

In the view if i use th:text="${book} then a list of Entity objects appears like this for each row from the table. This is what is shown:

Entity of type sec.helloworld.Book with id: null.

I just want the book names to show up not the objects. How am I supposed to do that?

2

There are 2 answers

1
Turo On BEST ANSWER

Yoor getter for name must be named getName() in order to be found by ExpressionLanguage(SpEL = Spring Expresion Language). The setter should be setName, too.

0
markwoollen On

use Lombok to automagically generate getters/setters...

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@Entity
@Entity
@Table(name = "Book")
public class Book extends AbstractPersistable<Long> {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;

    ...
    // Remove your hand-coded getters/setters
}

Maven POM.XML

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
</dependency>