Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 实体不是已知的实体类型_Jsf_Ejb - Fatal编程技术网

Jsf 实体不是已知的实体类型

Jsf 实体不是已知的实体类型,jsf,ejb,Jsf,Ejb,我尝试用JSF和JavaEE在Java中创建一个简单的JavaEE应用程序 我无法部署以下客户实体: package ch.uufstellend.onlineshop.model; import java.io.Serializable; import javax.ejb.Stateful; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.I

我尝试用JSF和JavaEE在Java中创建一个简单的JavaEE应用程序

我无法部署以下客户实体:

package ch.uufstellend.onlineshop.model;

import java.io.Serializable;
import javax.ejb.Stateful;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import lombok.Data;

@Entity
@Data
@Table(name = "CUSTOMER")
@NamedQuery(
        name = "Customer.findAll",
        query = "SELECT c FROM Customer c")
public class Customer implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private Long id;

    private String email;

    private String password;

    public Customer() {
    }

    @Override
    public String toString() {
        return id + "-" + email + "-" + password;
    }
}
因为:

严重:部署应用程序[uuf onlineshop ear]时出现异常: 无效的ejb jar[uuf-onlineshop-ejb-1.0-SNAPSHOT.jar]:它包含 零ejb。注:

  • 一个有效的EJBJAR至少需要一个会话、实体(1.x/2.x样式)或消息驱动bean

  • EJB3+实体bean(@entity)是POJO,请将它们打包为库jar

  • 如果jar文件包含使用EJB组件级注释(@Stateless、@Stateful、@MessageDriven、, @Singleton),请检查server.log以查看注释是否正确处理

  • 如果我向实体添加@Stateful注释,我就能够部署应用程序。 但是,当我随后访问RegisterController时,在持久化客户时会引发以下异常:

    例外情况:> javax.servlet.ServletException:java.lang.IllegalArgumentException: 对象: ch.uufstellend.onlineshop.model.\uuuEJB31\u生成的\uuuuuuu客户\uuuuuuuuuuu Intf\uuuuuuuuuuuu 302872188 不是已知的实体类型。根本原因

    javax.faces.el.EvaluationException: java.lang.IllegalArgumentException:对象: ch.uufstellend.onlineshop.model.\uuuEJB31\u生成的\uuuuuuu客户\uuuuuuuuuuu Intf\uuuuuuuuuuuu 302872188 不是已知的实体类型

    控制器:

    package ch.uufstellend.onlineshop;
    
    import ch.uufstellend.onlineshop.model.Customer;
    import java.io.Serializable;
    
    import javax.annotation.Resource;
    import javax.enterprise.context.RequestScoped;
    import javax.faces.application.FacesMessage;
    import javax.faces.context.FacesContext;
    import javax.inject.Inject;
    import javax.inject.Named;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.PersistenceUnit;
    import javax.transaction.HeuristicMixedException;
    import javax.transaction.HeuristicRollbackException;
    import javax.transaction.NotSupportedException;
    import javax.transaction.RollbackException;
    import javax.transaction.SystemException;
    import javax.transaction.UserTransaction;
    import lombok.Getter;
    import lombok.Setter;
    
    @Named
    @RequestScoped
    public class RegisterController implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @PersistenceUnit
        private EntityManagerFactory emf;
    
        @Resource
        private UserTransaction ut;
    
        @Inject
        @Getter
        @Setter
        private Customer customer;
    
    
        public String persist() {
            try {
                ut.begin();
                EntityManager entityManager = emf.createEntityManager();
                entityManager.persist(customer); // HERE the error is thrown
                ut.commit();
                FacesMessage m = new FacesMessage("Succesfully registered!", "Your email was saved under id " + customer.getId());
                FacesContext.getCurrentInstance().addMessage("registerForm", m);
            } catch (NotSupportedException | SystemException | RollbackException | HeuristicMixedException | HeuristicRollbackException | SecurityException | IllegalStateException e) {
                e.printStackTrace();
                FacesMessage m = new FacesMessage(FacesMessage.SEVERITY_WARN, e.getMessage(), e.getCause().getMessage());
                FacesContext.getCurrentInstance().addMessage("registerForm", m);
            }
            return "/register.jsf";
        }
    }
    

    你知道问题出在哪里吗?

    你的
    @Entity
    实体bean很好。不要修改它。将其设置为EJB确实会导致所描述的异常,因为EJB容器围绕类创建了一个代理,而该类又不会被识别为JPA实体

    您的名为的托管bean是错误的。它与EJB职责(持久性和事务管理)紧密耦合。将EJB职责拆分为一个真正的无状态会话bean,并让托管bean调用它

    @Stateless
    public class RegisterService {
    
        @PersistenceContext
        private EntityManager entityManager;
    
        public void persist(Customer customer) {
            entityManager.persist(customer);
        }
    
    }
    
    注意,您不需要手动处理真实EJB中的用户事务。只有
    Customer
    上的
    @Inject
    有点奇怪。我不确定
    @Data
    的作用是什么,但如果它与CDI的
    @Model
    注释具有相同的效果,那么就可以了。否则,请转到下面的第二个链接,以获取具体示例和更多链接

    另见:

      • 您的
        @Entity
        实体bean一切正常。不要修改它。将其设置为EJB确实会导致所描述的异常,因为EJB容器围绕类创建了一个代理,而该类又不会被识别为JPA实体

        您的名为的托管bean是错误的。它与EJB职责(持久性和事务管理)紧密耦合。将EJB职责拆分为一个真正的无状态会话bean,并让托管bean调用它

        @Stateless
        public class RegisterService {
        
            @PersistenceContext
            private EntityManager entityManager;
        
            public void persist(Customer customer) {
                entityManager.persist(customer);
            }
        
        }
        
        注意,您不需要手动处理真实EJB中的用户事务。只有
        Customer
        上的
        @Inject
        有点奇怪。我不确定
        @Data
        的作用是什么,但如果它与CDI的
        @Model
        注释具有相同的效果,那么就可以了。否则,请转到下面的第二个链接,以获取具体示例和更多链接

        另见:

        最后一个小问题:我有一个ejb和一个web maven项目。我应该将RegisterService放在哪个位置?它是否像一个DAO,应该放在EJB中,所有数据相关的东西都在EJB中?另外,@Data是Lombok注释,并自动生成setter、getter、overrides-toString+equals和hashCode方法:您应该将EJB类放入EJB项目中,是的。最后有一个小问题:我有一个EJB和一个web maven项目。我应该将RegisterService放在哪个位置?它是否像一个DAO,应该放在EJB中,所有数据相关的东西都在EJB中?另外,@Data是Lombok注释,并自动生成setter、getter、overrides-toString+equals和hashCode方法:您应该将EJB类放入EJB项目中,是的。