[JAVA] Ce que j'ai fait lorsque JSF ne pouvait pas afficher les informations de la base de données dans la vue

image.png

À 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.


Ce que vous utilisez

Ce que vous voulez faire et problèmes

① Enregistrez la valeur saisie dans la base de données ② Afficher les informations enregistrées dans la base de données sur la page

image.png

problème

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&nbsp;(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&nbsp;(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&nbsp;(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();
    }
    
}

3 choses que j'ai essayé de résoudre

1. Vider le cache

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)

2. Réduisez la balise resources dans `` `glassfish-resources.xhtml``` à une

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!

3. Modifiez la fonction à utiliser

Cette fois, j'ai eu une autre erreur. image.png 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é! !!

Résumé

Recommended Posts

Ce que j'ai fait lorsque JSF ne pouvait pas afficher les informations de la base de données dans la vue
[Rails] Comment afficher les informations stockées dans la base de données dans la vue
Je souhaite afficher un message d'erreur lors de l'inscription dans la base de données
[Java] Informations entières des caractères du fichier texte acquises par la méthode read ()
Ce que j'ai fait lorsque JSF ne pouvait pas afficher les informations de la base de données dans la vue
Les caractères japonais décrits dans MessageResources.properties sont déformés
[java] Ce que j'ai fait en comparant des listes dans ma propre classe
À propos de ce que j'ai fait lors de la création d'un fichier .clj avec Clojure
Ce que j'ai fait lors de la migration de la série Spring Boot 1.4 vers la série 2.0
Ce que j'ai fait lors de la migration de la série Spring Boot 1.5 vers la série 2.0
À quoi me suis-je préparé lorsque je suis entré dans un projet de développement d'application Android tout en développant le Web avec Java?
Que faire lorsque la valeur devient nulle dans le second getSubmittedValue () dans JSF Validator
Ce que j'ai fait lorsque j'ai converti Java en Kotlin
[Résumé] Ce que j'ai remarqué et fait quand on m'a dit que le JDK Oracle était payé
Ce que j'ai appris lors de la création d'un serveur en Java
[Rails] Comment afficher les images dans la vue
Ce que je suis tombé sur le test ActiveModel :: Serializer
Ce à quoi j'étais accro lors de l'introduction de la bibliothèque JNI
IntelliJ gradle 2.2 → 2.6 Ce que j'ai fait lorsque je suis tombé sur la migration de l'environnement
[Rails] Que faire lorsque l'erreur Aucune base de données sélectionnée et Base de données inconnue apparaît dans db: migrate
Ce que les débutants du développement Android ont fait avant de publier l'application dans 2 semaines
Que faire si j'écris une clause finally dans la syntaxe try-with-resources?
Que faire lorsque les modifications du servlet ne sont pas reflétées
[rails] Comment afficher les informations parent dans la vue enfant dans des relations imbriquées
Ce que j'ai vérifié lorsque j'ai installé Docker Hub dans un environnement domestique Windows 10 mais qu'il n'a pas démarré