IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Java Discussion :

EJB / REST / JPA probléme avec l'erreur Http 500


Sujet :

Services Web Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 77
    Points : 37
    Points
    37
    Par défaut EJB / REST / JPA probléme avec l'erreur Http 500
    Bonjour à tous

    J'ai réalisé un projet avec EJB / REST / JPA , les fonctionalités EJB / JPA marchent trés bien avecc la base de données, le probléme vient REST . Quand je lance une requéte Uri pour obtenir la liste des questions (http://localhost:8080/SurveyWeb/rest/stats/sujet ) , je reçois un message d'erreur HTTP 500 sur la page mais sans détailler les erreurs ni sur la console du serveur (Glassfish / eclipse ) donc je ne sais pas de quelle erreur s'agit-t-il.
    Ci dessous mes codes simples

    ENTITY
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    @Entity
    @Table(name = "Questionnaire") 
     
    @NamedQueries({
        @NamedQuery(name="Questionnaire.findByName", query="SELECT u from Questionnaire u where u.nom = :nom"),
        @NamedQuery(name="Questionnaire.findAllOrderById", query="SELECT u FROM Questionnaire u order by u.id"),
     
    })
    @XmlRootElement(name = "questionnaire") 
    public class Questionnaire implements Serializable{
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	@Id 
    	@GeneratedValue(strategy=GenerationType.IDENTITY)
    	@Column(name = "ID_QUESTIONNAIRE")
    	private int id;
    	@Column(name = "NOM")
    	private String nom;
    	@Column(name = "DESCRIPTION")
    	private String description;
     
    	@OneToMany(mappedBy = "questionnaire", cascade = CascadeType.ALL)
    	private Set<Question> question;
     
    	public Questionnaire() {
     
    	}
     
     
    	public Questionnaire( String nom, String description) {
     
    		this.nom = nom;
    		this.description = description;
     
    	}
     
    	/**
             * les getters et setters
             */
     
     
    }

    DAO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    @Stateless
    public class QuestionnaireDao implements QuestionnaireLocal {
     
     
    	 @PersistenceContext
    	 private EntityManager em;
     
    	public Questionnaire getQuestionnaire(int id)  throws IOException,AppException{
    		return em.find(Questionnaire.class, id);
    	}
     
    	@SuppressWarnings("unchecked")
    	public List<Questionnaire> list()   throws IOException,	AppException{
    	    Query query=em.createQuery("select m from Questionnaire m");
            return (List<Questionnaire>) query.getResultList();
    	}
     
    }
    SERVICE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    @Stateless
    @LocalBean
    @Path("/stats")
    public class SujetService {
     
    	@EJB
    	private QuestionnaireLocal customersDao;
    	@EJB
    	private QuestionLocal questionDao ;
     
     
    	@GET
    	@Path("/sujets")
    	@Produces("application/json")
    	@Consumes("application/json")
    	public List<Questionnaire> sujets() throws IOException,	AppException {
     
    	    for (Questionnaire ques : customersDao.list() ) {
    	    	System.out.println(ques.getNom());  //--> affiche bien la liste des questions sur la console
    			}
     
    		return customersDao.list();
     
    	}
    }
    WEB.XML
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
      <display-name>SurveyWeb</display-name>
      	<filter>
    		<filter-name>struts2</filter-name>
    		<filter-class>
    			org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    		</filter-class>
    	</filter>
     
    			<filter>
    	    <filter-name>Tiles Filter</filter-name>
    	    <filter-class>org.apache.tiles.web.startup.TilesFilter</filter-class>
    	    <init-param>
    	        <param-name>
    	          org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG
    	        </param-name>
    	        <param-value>
    	          /WEB-INF/tiles.xml
    	        </param-value>
    	    </init-param>
    	</filter>
     
    	<filter-mapping>
    		<filter-name>struts2</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
      <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
          <param-name>jersey.config.server.provider.packages</param-name>
          <param-value>fr.survey.service</param-value>
        </init-param>
        	<init-param>
    		<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    		<param-value>true</param-value>
    	</init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/rest/*</url-pattern>
      </servlet-mapping>
      
    </web-app>
    Sans EJB , la requête marchait bien.

    Merci

  2. #2
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Le fait d'appeler deux fois de suite customersDao.list() n'est pas utile, mais je doute que ça vienne de là


    Sinon, ton url (http://localhost:8080/SurveyWeb/rest/stats/quest ) et ce qui est dans tes Objets n'est pas cohérent, à priori il faudrait tenter http://localhost:8080/SurveyWeb/rest/stats/sujets
    Je ne suis pas mort, j'ai du travail !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 77
    Points : 37
    Points
    37
    Par défaut
    Je me suis tromper à propos l'erreur, c'est HTTP 500 et non 505.

    oui le lien est bien "http://localhost:8080/SurveyWeb/rest/stats/sujets", je me suis trompé dans le message mais le probléme est toujours là

    Y a t-il une solution pour bien connaitre l'erreur ? car aucune log ou console n'affichent la raison

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu retourne des objets de type Questionnaire, mais ils contiennent des Question. Je parierais pour un LazyInitializationException lors de la serialisation parce que l'entitymanager est déjà fermé. Soit tu annote la collection pour désactiver le lazy loading, soit tu la parcours dans ton dao pour l'initialiser avec le retour.
    Tu peux aussi essayer d'ajouter @TransactionAttribute(REQUIRED) sur ta méthode REST

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 77
    Points : 37
    Points
    37
    Par défaut
    j'oublie de vous montrer l'interface

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    @Local
    public interface QuestionnaireLocal {
    	    public List<Questionnaire> list();
       	    public Questionnaire getQuestionnaire(int id);
    }
    Est ce correct avec @Local ?

    Merci tchize , Je vais tester ta méthode

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 77
    Points : 37
    Points
    37
    Par défaut
    En effet, cela provient de la collection Question, je l'ai enlevé de la table questionnaire avec l'annotation @onetomany
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @OneToMany(mappedBy = "questionnaire", cascade = CascadeType.ALL)
    	private Set<Question> question;
    le résulat marche.
    Donc pour utiliser la collection, j'ai ajouté 'fetch = FetchType.EAGER' pour désactiver Lazy et @TransactionAttribute(REQUIRED) dans la méthode mais le probléme persiste

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 77
    Points : 37
    Points
    37
    Par défaut
    je cherche un exemple avec rest + ejb + jpa collection ?

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Vérifie que ton Question n'as pas aussi des valeurs lazy à l'intérieur. Sinon le plus simple c'est de transférer tes données dans un DTO et de retourner ce DTO, ça évite ce genre de blague avec les transactions.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 77
    Points : 37
    Points
    37
    Par défaut
    Tu veux dire sans utiliser EJB ?

    sinon ci -dessus la classe question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
     
    @Entity
    @XmlRootElement 
    @Table(name="question")
    public class Question implements Serializable {
     
    	private static final long serialVersionUID = 1L;
     
    	@Id 
    	@GeneratedValue(strategy=GenerationType.IDENTITY)
    	@Column(name = "ID_QUESTION")
    	private int id;
     
    	@ManyToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    	@JoinColumn(name = "ID_QUESTIONNAIRE", referencedColumnName = "ID_QUESTIONNAIRE")
    	private Question questionnaire;
     
    	@Column(name = "INTITULE")
    	private String intituleQuesto;
    Je doute que le problème vient de l'annotation de JPA car j'ai crée un site web qui permet d'afficher la liste des questions et cela marche trés bien .C'est juste que REST qui n'arrive pas à générer Json/XML lors de la requéte.
    J'ai aussi testé avec les annotation JPA suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    	@ManyToOne(cascade = CascadeType.DETACH) 
    	@XmlTransient
    	@Fetch(value=FetchMode.JOIN)

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    le site web affiche les donnée jpa pendant la transaction. Au niveau du REST, je suppose que l'objet est retourné par l'EJB, la transaction close, et ensuite seulement, le serializer json tente d'explorer l'objet, entrainant des Exceptions.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 77
    Points : 37
    Points
    37
    Par défaut
    Je n'arrive pas

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 77
    Points : 37
    Points
    37
    Par défaut
    J'ai crée un application Android pour faire un test vers mon serveur.
    Je remarque que le message d'erreur affiche " connection http:\\192.168.xxxx:8080" refused "

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 77
    Points : 37
    Points
    37
    Par défaut
    Eureka

    il faut mettre @XmlTransient au niveau de getter qui reçoit la liste des questions

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. librairies pour ejb 3, jpa, jsf
    Par geeksDeve dans le forum JSF
    Réponses: 2
    Dernier message: 10/07/2012, 12h04
  2. Intégration Paypal dans un site ecommerce EJB JSF JPA
    Par othman22222 dans le forum JSF
    Réponses: 10
    Dernier message: 23/06/2012, 19h12
  3. [EJB / REST / JSON / JQuery] Problème pour faire un POST
    Par saveriu dans le forum Services Web
    Réponses: 1
    Dernier message: 19/04/2012, 11h08
  4. EJB REST jersy
    Par ahmeddrira dans le forum Services Web
    Réponses: 0
    Dernier message: 19/03/2012, 22h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo