【问题标题】:Method property not found in JSF expression using EJB to JPA在使用 EJB 到 JPA 的 JSF 表达式中找不到方法属性
【发布时间】:2013-11-14 22:46:42
【问题描述】:

我目前正在尝试使用 JSF 编写一个应用程序,该应用程序使用 EJB 会话 bean 来调用数据库 (MySQL),但是当我尝试访问该页面时,我收到一个错误提示

The class 'model.PlanetQueryManagedBean$Proxy$_$$_WeldClientProxy' does not have the property 'getPlanets'. 

JSF页面的代码如下:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <h:dataTable value="#{planetQueryManagedBean.getThePlanets}" var="pln">
                <h:column>
                    <f:facet name="header">Name</f:facet>
                    #{pln.name}
                </h:column>
                <h:column>
                    <f:facet name="header">Description</f:facet>
                    #{pln.desc}
                </h:column>
            </h:dataTable>
        </h:form>
    </h:body>
</html>

JSF托管bean的代码是:

package model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Named;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;

@Named
@SessionScoped
public class PlanetQueryManagedBean implements Serializable {

    @EJB
    private QueryBean thePlanets;

    public List<Planets> getThePlanets() {
        return thePlanets.getListofPlanets();
    }
}

最后,EJB 会话 bean:

package model;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

@Stateless
public class QueryBean {

    @PersistenceContext(name="PlanetsORM") 
    EntityManager em;

    public QueryBean() {
    }

    public List<Planets> getListofPlanets() {       
        TypedQuery<Planets> theQuery = em.createQuery("select p from Planets p", Planets.class);
        List<Planets> result = theQuery.getResultList();

        return result;
    }

}

我在 Core JavaServer Faces 一书中查看了主要来源,据我了解,这是应该做的。当然,我也仔细查看了 Stack Overflow 问题,但我没有找到任何可以帮助我的东西。

我发现有人提到如果 EJB 没有成功实例化,可能会发生这样的事情,但我真的不知道如何找出来......

我使用 GlassFish 4.0 作为应用服务器,使用 Eclipse 作为我的 IDE。

谁能帮助我?或者至少帮助我找出如何更好地理解错误?

最好的问候,

托比亚斯

【问题讨论】:

  • 您得到的异常来自javax.el 包(因此,与EL 表达式有关)。这与 EJB 几乎没有任何关系。并且,请不要将 Stack Overflow 问题编辑器用作代码编辑器。现在异常消息和代码不匹配(getPlanets!= getThePlanets)。只需复制粘贴未经修改的真实代码,否则您只会引入红鲱鱼。顺便说一句,您的托管 bean 代码中还有另一个主要问题:thou should not do business logic in a getter method
  • PlanetQueryManagedBeanQueryBean是什么关系?如何从 facelet 调用 PlanetQueryManagedBeanPlanetQueryManagedBean隐藏数据库连接细节?

标签: jsf jpa jsf-2 ejb


【解决方案1】:

一个属性可以有一个setter和一个getter。您必须在没有 get 或 set 的情况下引用属性,并且第一个字母为小写:

#{planetQueryManagedBean.thePlanets}

【讨论】:

  • 太棒了,非常感谢!我觉得自己完全是个白痴,没有看到这个……但是,现在它工作正常了!再次感谢!
猜你喜欢
  • 1970-01-01
  • 2015-10-14
  • 2017-02-15
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多