在'org - Thymeleaf-Spring类型的对象上找不到字段或属性

时间:2017-09-21 14:44:58

标签: spring-mvc spring-boot spring-data-jpa thymeleaf

我已经尽了一切可能,但我得到的解决方案我自己并不喜欢它。

我正在使用Spring Framework和Thymeleaf。在我的实体类中,我将我的属性声明为私有,如下所示

public class Subscriber {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

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

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

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

    public Subscriber(){
    }
}

在Thymeleaf,我正在使用th:tyo从我的数据库中获取数据,如下所示:

<tr th:each="subscriber : ${subscribers}">
        <td th:text="${subscriber.firstname} + ' ' + ${subscriber.lastname}"></td>
        <td th:text="${subscriber.email}"></td>

当我运行代码时,我在运行时遇到以下错误:

org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'firstname' cannot be found on object of type '' - maybe not public?

现在,如果我将修改器更改为public,一切正常,我的数据就会显示出来。但是,我不认为这是建模实体的最佳方式。我需要警惕将来可能访问我的代码库的第三方,从而阻止他们修改我的代码并对我造成损害。

因此,我需要有更多经验的人提供帮助,无需将修饰符更改为私有。

感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

您可以通过将私有声音更改为公共声音来获取属性,例如您的吸气剂有问题。您应该在Subscriber类中检查您的getter和setter。
如果getter是getFirstName(),则它将无法正常工作,因为类中的属性名称是“ firstname”而不是firstName。

@Entity
@Table(name= "subscribers")
public class Subscriber {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

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

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

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

    public long getId(){
       return this.id;
    }
    public void setId(long id){
       this.id = id;
    }     
    //This should not be getFirstName()
    public String getFirstname(){
       return this.firstname;
    }
    public void setFirstname(String fistname){
       this.firstname = firstname;
    }     
    //This should not be getLastName()
    public String getLastname(){
       return this.lastname;
    }
    public void setLastname(String lastname){
       this.lastname = lastname;
    }   

    public String getEmail(){
       return this.email;
    }
    public void setEmail(String email){
       this.email = email;
    } 

    public Subscriber(){
    }
}

在百里香中称呼这些

<tr th:each="subscriber : ${subscribers}">
<td th:text="${subscriber.firstname} + ' ' + ${subscriber.lastname}"></td>
<td th:text="${subscriber.email}"></td>

我还没有测试这些,但是它们应该可以工作。

答案 1 :(得分:0)

有点奇怪,如果你有公共字段范围,它可以工作。但我所看到的是你的表达不正确。

尝试使用<td th:text="${subscriber.firstname + ' ' + subscriber.lastname}"></td>

答案 2 :(得分:0)

Thymeleaf在视图层中使用getter方法。当您说subscriber.firstName时,它将调用subscriber.getFirstName()。因此,在public类中具有Subscriber访问修饰符的吸气剂。