Java JPA属性访问提供NullPointerException

Java JPA属性访问提供NullPointerException,java,jpa,Java,Jpa,我的数据库中有一个名为Products的表,我正在使用JPA2.0来访问它 我正在Glassfish服务器上使用JSF2.0 我的图层如下所示: products.xhtml->ProductsBackingBean.java->ProductsDao.java->Produtcs.java 下面是products.xhtml: <h:form> <p:dataTable var="product" value="#{productsBackingBean.allPro

我的数据库中有一个名为Products的表,我正在使用JPA2.0来访问它

我正在Glassfish服务器上使用JSF2.0

我的图层如下所示:

products.xhtml->ProductsBackingBean.java->ProductsDao.java->Produtcs.java

下面是products.xhtml:

<h:form>
    <p:dataTable var="product" value="#{productsBackingBean.allProducts}">
        <p:column headerText="Product Code">
            <h:outputText value="#{product.productCode}"/>
        </p:column>
        <p:column headerText="Product Description">
            <h:outputText value="#{product.productDescription}"/>
        </p:column>
    </p:dataTable>
</h:form>
因此,重要的部分是:

返回productDescription.substring(0,20)

在我的表格中,我只想显示产品描述的前20个字符。但我有一个例外:

异常 javax.servlet.ServletException 根本原因 javax.ejb.NoSuchEJBException 根本原因 javax.ejb.NoSuchObjectLocalException:ejb不存在。会话密钥:3890c00100a81f-3a922970-0

我必须注意,当我在ProductDao的init()方法中找到一个断点时,我看到它被调用了。但是,当ProductBackingBean调用productDao.getAllProducts时,productDao似乎为空

在日志中,我还看到:

在com.tugay.maythero.model.EJB31\u生成的产品dao\u Intf\uBean\uu.getAllProducts(未知来源) 在com.tugay.maythero.model.ProductsBackingBean.getAllProducts(ProductsBackingBean.java:14)

如果删除子字符串(0,20),则一切正常。

我有两个问题:

  • 我做错了什么
  • 要显示前20个字符,正确的方法是什么?它应该在ProductsTableBackingBean.java、ProductsDao.java中,还是直接在这里看到的实体类中
    正确的方法是在ui层削减您的价值。实体字段可能在完全初始化之前被访问,这会导致您尝试修剪空值。

    正确的方法是在ui层修剪您的值。实体字段可能在完全初始化之前被访问,这会导致您尝试修剪空值。

    数据库中可能有
    null
    productDescription
    ,因此有必要在
    子字符串
    之前检查
    null
    值,如下示例:

    @javax.persistence.Column(name = "productDescription")
    @Basic
    public String getProductDescription() {
            return productDescription !=null ? productDescription.substring(0,20) : "";
    }
    
    但是我建议您保持
    getProductDescription()
    的完整性,并创建一个新的来返回简短的描述,它将是:

        @javax.persistence.Column(name = "productDescription")
        @Basic
        public String getProductDescription() {
                return productDescription;
            }
    
        public String getShortDescription() {
            return productDescription !=null ? productDescription.substring(0,20) : "";
        }
    

    数据库中可能有
    null
    productDescription
    ,因此有必要在
    substring
    之前检查
    null
    值,如下例:

    @javax.persistence.Column(name = "productDescription")
    @Basic
    public String getProductDescription() {
            return productDescription !=null ? productDescription.substring(0,20) : "";
    }
    
    但是我建议您保持
    getProductDescription()
    的完整性,并创建一个新的来返回简短的描述,它将是:

        @javax.persistence.Column(name = "productDescription")
        @Basic
        public String getProductDescription() {
                return productDescription;
            }
    
        public String getShortDescription() {
            return productDescription !=null ? productDescription.substring(0,20) : "";
        }
    

    似乎数据库中的“productDescription”值为null。在执行子字符串之前,请先执行nullcheck@Nambari如果我删除子字符串(0,20),一切都很好。是的,如果对空引用执行任何操作,就会发生NPE。所以,我猜您得到的productdescription为空。@Nambari感谢您的评论。但是为什么呢?是因为它试图在从数据库获取数据之前应用该方法吗?有趣的..@KorayTugay刚刚发布了一个包含更多信息的答案。似乎您在数据库中的“productDescription”值为null。在执行子字符串之前,请先执行nullcheck@Nambari如果我删除子字符串(0,20),一切都很好。是的,如果对空引用执行任何操作,就会发生NPE。所以,我猜您得到的productdescription为空。@Nambari感谢您的评论。但是为什么呢?是因为它试图在从数据库获取数据之前应用该方法吗?有趣..@KorayTugay刚刚发布了一个包含更多信息的答案。我认为bean有问题,而不是值本身。可能是吗?我认为bean有问题,而不是值本身。会吗?
        @javax.persistence.Column(name = "productDescription")
        @Basic
        public String getProductDescription() {
                return productDescription;
            }
    
        public String getShortDescription() {
            return productDescription !=null ? productDescription.substring(0,20) : "";
        }