【问题标题】:"Exception evaluating SpringEL expression" error while trying to iterate List(<Object>) in Thymeleaf Spring Boot尝试在 Thymeleaf Spring Boot 中迭代 List(<Object>) 时出现“异常评估 SpringEL 表达式”错误
【发布时间】:2020-07-21 00:16:10
【问题描述】:

我是 Spring Boot 的新手,并尝试使用 JPA/JPQL 在两个不相关的实体(事务和项目)之间建立连接。但是在使用 thymeleaf 以表格格式显示时出现以下错误:

2020-04-08 21:42:42.463 ERROR 73816 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "transactiondetail.tid" (template: "index" - line 27, col 21)] with root cause
org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'tid' cannot be found on object of type 'java.lang.Object[]' - maybe not public or not valid?

以下是我的百里香实现:

    <tr th:each="transactiondetail : ${listTransactionDetail}">
        <td th:text="${transactiondetail.tid}">TID</td>
        <td th:text="${transactiondetail.from_uid}">From UID</td>
        <td th:text="${transactiondetail.to_uid}">To UID</td>
        <td th:text="${transactiondetail.item_name}">Item Name</td>
        <td th:text="${transactiondetail.item_count}">Count</td>
        <td th:text="${transactiondetail.status}">Status</td>

下面是控制器:

@Autowired
QueryService queryservice; 

@RequestMapping("/")
public String viewHomePage(Model model) {
    List<TransactionDetail> listTransactionDetail = queryservice.JPQLQuery();
    model.addAttribute("listTransactionDetail", listTransactionDetail);
    return "index";
    }

我只要返回queryservice.JPQLQuery()就可以得到结果,这意味着加入和列表正在工作。 以下是控制器正在调用的服务:

@Service
public class QueryService implements IQueryService {

    @Autowired
    EntityManagerFactory emf;

    @Override
    public List<TransactionDetail> JPQLQuery()
    {
        EntityManager em = emf.createEntityManager();

        Query query = em.createQuery("Select s.tid,s.from_uid,s.to_uid,d.item_name,s.item_count,s.status from Transaction s inner join Item d on s.item_id=d.item_id");
        @SuppressWarnings("unchecked")
        List<TransactionDetail> tranlist = (List<TransactionDetail>)query.getResultList();
        em.close();
        return tranlist;

    }

}

下面显示的是接收连接实体的 TransactionDetail 类。如您所见,我同时拥有具有正确名称的构造函数和 getter/setter。仍然无法正确显示详细信息。

public class TransactionDetail {
    private Long tid;
    private int from_uid;
    private int to_uid;
    private String item_name;
    private int item_count;
    private int status;

    public TransactionDetail() {
    }

    public TransactionDetail(Long tid, int from_uid, int to_uid, String item_name, int item_count, int status) {
        super();
        this.tid = tid;
        this.from_uid = from_uid;
        this.to_uid = to_uid;
        this.item_name = item_name;
        this.item_count = item_count;
        this.status = status;
    }

    public Long getTid() {
        return tid;
    }

    public void setTid(Long tid) {    
        this.tid = tid;    
    }

    public int getFrom_uid() {    
        return from_uid;    
    }    
    public void setFrom_uid(int from_uid) {    
        this.from_uid = from_uid;    
    }

    public int getTo_uid() {    
        return to_uid;    
    }    
    public void setTo_uid(int to_uid) {    
        this.to_uid = to_uid;    
    }   

    public int getItem_count() {    
        return item_count;    
    }    
    public void setItem_count(int item_count) {    
        this.item_count = item_count;    
    }

    public int getStatus() {    
        return status;    
    }    
    public void setStatus(int status) {    
        this.status = status;    
    }

    public String getItem_name() {
        return item_name;
    }

    public void setItem_name(String item_name) {
        this.item_name = item_name;
    }

}

我猜这个问题与我将结果从query.getResultList() 保存到List&lt;TransactionDetail&gt; 的方式有关。那么知道如何解决这个问题吗?提前致谢!

【问题讨论】:

    标签: java spring spring-boot thymeleaf


    【解决方案1】:

    您的Query 正在返回ListObject。但是,EntityManager 有这样的重载:

    public &lt;T&gt; TypedQuery&lt;T&gt; createQuery(String qlString, Class&lt;T&gt; resultClass);

    通过使用第二个参数,您的结果将不需要转换为List&lt;TransactionDetail&gt;,因此您应该向 createQuery 方法添加第二个参数,在您的情况下为TransactionDetails.class

    【讨论】:

    • 非常感谢!这样做并不能解决我的问题,但多亏了这一点,我才能够找出问题所在。我的查询返回 2 个不同实体的位,并且无法将结果转换为 TransactionDetails 对象。因此,它在将这些位转换为查询中的 TransactionDetails 对象后起作用。
    【解决方案2】:

    我相信这是因为您没有从控制器返回模型,而只是返回视图。尝试修改您的控制器以读取,

    public ModelAndView viewHomePage(Model model) {
    

    并将模型和视图返回为

    return new ModelAndView( "index", model.asMap());
    

    【讨论】:

    • 感谢您的回复!但事实证明这个问题是由于我初始化我的 createquery 的方式造成的。发布我的解决方案。
    【解决方案3】:

    原来问题是由于我试图将查询的结果(这是 2 个不同实体的位)转换为新的类对象。因此,通过更改查询以包括使用构造函数调用创建目标对象的新实例来修复它:

    TypedQuery<TransactionDetail> query = em.createQuery("Select NEW package_name.TransactionDetail(s.tid,s.from_uid,s.to_uid,d.item_name,s.item_count,s.status) from Transaction s inner join Item d on s.item_id=d.item_id", TransactionDetail.class);
    List<TransactionDetail> tranlist = query.getResultList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-24
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多