À propos du problème que `` javax.ejb.EJBException '' apparaît lorsque vous essayez d'afficher les informations de la base de données dans la vue. J'ai essayé de résumer ce que j'ai fait jusqu'à la solution sous forme de mémorandum.
① Enregistrez la valeur saisie dans la base de données ② Afficher les informations enregistrées dans la base de données sur la page
Quand j'ai exécuté ② avec le code suivant, j'ai eu une erreur
javax.ejb.EJBException```.
index.xhtml (Sous l'étiquette du corps)
<h2>Créer des données</h2>
<h:form>
<h:panelGrid columns="2">
nombre:
<h:inputText value ="#{backigBean.number}" />
Nom:
<h:inputText value ="#{backigBean.name}" />
<h:commandButton value="Créer" action="#{backigBean.create}" />
<h:commandButton value="Annuler" type="reset" />
</h:panelGrid>
<br/>
<br/>
<h2>Liste des informations créées</h2>
<h:dataTable value="#{backigBean.getAll}" var="item">
<h:column>#{item.number}</h:column>
<h:column>#{item.name}</h:column>
<h:column><h:commandLink value="Éditer" action="#{backigBean.toReturn}" /></h:column>
<h:column><h:commandButton value="Effacer" action="#{backigBean.delete(item)}" /></h:column>
</h:dataTable>
<h:commandButton value="Revenir" action="#{backigBean.toReturn}" />
</h:form>
BackingBean.java (Code de logique métier)
package backingBeans;
import ejb.DataManager;
import entity.Data;
import java.io.Serializable;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@SessionScoped
@ManagedBean
public class BackingBean implements Serializable{
private Integer number;
private String name;
@EJB
private DataManager dm;
//Stockage de données
public String create(){
Data data = new Data();
data.setNumber(number);
data.setName(name);
if(number == null) return null;
try{
dm.create(data);
}catch(javax.ejb.EJBException e){}
clear();
return null;
}
//Récupérer toutes les données de DB
public List<Data> getAll(){
return dm.getAll();
}
//Suprimmer les données
public String delete(Data data){
dm.delete(data);
return null;
}
//Effacer le navigateur
public void clear(){
number = null;
name = null;
}
//Revenir à la même page
public String toReturn(){
return null;
}
//Getter et Setter
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Data.java (Classe de données)
package entity;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Data implements Serializable{
@Id
private Integer number;
private String name;
public Data(){}
public Data(Integer number, String name){
this.number = number;
this.name = name;
}
//Getter et Setter
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
DataManager.java (Code qui sert d'intermédiaire entre la base de données et les données)
package ejb;
import entity.Data;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class DataManager {
@PersistenceContext
private EntityManager em;
//Enregistrer la valeur d'entrée dans le DB
public void create(Data data){
em.persist(data);
}
//Supprimer les données sur DB
public void delete(Data data){
em.remove(em.merge(data));
}
//Obtenez toutes les données sur la base de données
public List<Data> getAll(){
return em.createNamedQuery("backingBean.getAll").getResultList();
}
}
Terminal
$ ~/Library/Caches
$ rm -rf NetBeans
Puis redémarrez NetBeans. ... mais rien n'a changé. (Site de référence: http://d.hatena.ne.jp/tkrd/20140818/1408315483)
glassfish-resources.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
<jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="org.apache.derby.jdbc.ClientDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="derby_net_test_appPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
<property name="serverName" value="localhost"/>
<property name="portNumber" value="1527"/>
<property name="databaseName" value="test"/>
<property name="User" value="testuser"/>
<property name="Password" value="test"/>
<property name="URL" value="jdbc:derby://localhost:1527/test"/>
<property name="driverClass" value="org.apache.derby.jdbc.ClientDriver"/>
</jdbc-connection-pool>
<jdbc-resource enabled="true" jndi-name="java:app/jdbc/test" object-type="user" pool-name="derby_net_test_appPool"/>
</resources>
Peut-être que dans cette balise de ressource, il est dit: "Dans ce projet, le serveur se connectera à cette base de données." Lorsque je me connecte à plusieurs bases de données, beaucoup d'informations de base de données sont automatiquement générées, donc je pense que le serveur n'a aucune idée de la base de données à laquelle se connecter ... Par conséquent, modifiez la balise de ressource afin qu'elle n'apparaisse qu'une seule fois dans ce fichier.
Cela résout le problème du serveur!
Cette fois, j'ai eu une autre erreur. Il semble que getAll n'est pas bon, alors changez la partie appropriée du fichier de vue en all.
index.xhtml
...(réduction)
<h2>Liste des informations créées</h2>
<h:dataTable value="#{backigBean.all}" var="item">
Ensuite,
javax.ejb.EJBException` `` apparaîtra à nouveau.
Par conséquent, modifiez le code de DataManager à la fonction suivante.
DataManager
//...(réduction)
//Obtenez toutes les données sur la base de données
public List<Data> getAll(){
//return em.createNamedQuery("backingBean.getAll").getResultList();Changer ici pour
return em.createQuery("SELECT c FROM Data c").getResultList();
}
déplacé! !!