找不到 JEE Web 应用程序实体 野蝇



我正在使用Wildfly 10。 我正在尝试将实体绑定到 jsf 页面并将其与 jpa 一起保存到我的数据库中。

我得到了一个 javax.servlet.ServletException: javax.ejb.EJBException: java.lang.IllegalArgumentException:Unknown entity: de.rupp.model.Contact$Proxy$_$$_WeldClientProxy javax.faces.webapp.FacesServlet.service(FacesServlet.java:671)

我的坚持.xml在 WEB-INF/classes/META-INF 中:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="contacts">
<!-- If you are running in a production environment, add a managed 
data source, this example data source is just for development and testing! -->
<!-- The datasource is deployed as WEB-INF/jsftest-ds.xml, you
can find it in the source at src/main/webapp/WEB-INF/jsftest-ds.xml -->
<jta-data-source>java:/ContactsDS</jta-data-source>
<class>de.rupp.model.Contact</class>
<properties>
<!-- Properties for Hibernate -->
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="false" />
</properties>
</persistence-unit>
</persistence>

我的实体

@Named
@RequestScoped
@Entity
@NamedQueries({
@NamedQuery(name=Contact.FIND_ALL, query="SELECT c FROM Contact c"),
@NamedQuery(name=Contact.DELETE_ALL, query="DELETE FROM Contact")
})
public class Contact implements Serializable{

public final static String FIND_ALL = "Contacts.findAll";
public final static String DELETE_ALL = "Contacts.deleteAll";
/**
* 
*/
private static final long serialVersionUID = -7050382512059267701L;
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
private String email;
private String phone;
private String message;

//getter and setter omitted for brevity 
}

我的控制器

@Named
@RequestScoped
public class EingabeController implements Serializable {
private Logger log = LoggerFactory.getLogger(EingabeController.class);
@Inject
private ContactsDAOBean contactsDAOBean;

@Inject
private Contact contact;

public void save() {
this.contactsDAOBean.save(this.contact);
log.info(this.contact + " saved");
}
}

我的持久层工作 我为此编写了一个Arquillian测试:

@RunWith(Arquillian.class)
public class ContactsDAOTest {

@Deployment
public static Archive<?> createTestArchive() {
return ShrinkWrap.create(WebArchive.class, "test.war")
.addClasses(Contact.class, AbstractDAO.class, AbstractDAOBean.class, ContactsDAOBean.class)
.addAsResource("META-INF/persistence.xml")
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
}


@Inject
private ContactsDAOBean contactsDAOBean;
@Before
public void init() {
contactsDAOBean.deleteAll();
}
@Test
public void save() {
Contact contact = new Contact();
contact.setEmail("h.rupp@dzbw.de");
contact.setFirstName("Hans");
contact.setLastName("Rupp");
contact.setPhone("0711 8108 276232");
contact.setMessage("Ich will hier raus");
contactsDAOBean.save(contact);
List<Contact> contacts = contactsDAOBean.findAll();
assertEquals(1, contacts.size());
}
}

任何想法将不胜感激

-------------------编辑--------------------------------------

我已经重构了这个页面: 最初,联系人实体已直接绑定到输入元素,例如

<h:inputText value="#{contact.firstName}"  styleClass="form-control"/>

我已经更改了控制器,以便它生成要保存的实体。

@Named
@RequestScoped
public class EingabeController implements Serializable {
@Inject
private ContactsDAOBean contactsDAOBean;
@Named
@Produces
private Contact newContact;
@PostConstruct
public void init() {
this.newContact = new Contact();
}
public String save() {
this.contactsDAOBean.save(this.newContact);
log.info(this.newContact + " saved");
this.savedContact = this.newContact;
return "data";
}
@Named
@Produces
private Contact savedContact;
}

@Named和@RequestScoped注释已从联系人属性中删除。

<h:inputText value="#{newContact.lastName}" styleClass="form-control" id="lastName"/>

该页面的工作方式是这样的,可以调用保存操作

而不会出错。也许真正的原因是我对JSF和CDI应该如何工作的误解。

我以为在原始版本中 - 绑定到控件的 Bean 在呈现页面时实例化 - Bean 填充了用户输入的值 - 当调用保存操作时,Bean 被注入控制器 好吧,这可能是我的推理错误:控制器被实例化了 与页面,当时注入了联系人 bean,这与绑定到控件的 bean 不是同一个实例吗?

我只是想(重新)学习 JSF....谁能推荐一个好的源代码来详尽地描述JSF应用程序的体系结构? 我想我有足够的书来单独讨论控件等。

尝试按如下所示编辑实体。

@Entity
@Table(name = "nameOfTableInDatabase", catalog = "databaseName")
@NamedQueries({
@NamedQuery(name=Contact.FIND_ALL, query="SELECT c FROM Contact c"),
@NamedQuery(name=Contact.DELETE_ALL, query="DELETE FROM Contact")
})
public class Contact implements java.io.Serializable {
bla
bla
}

最新更新