Module CSC7321—CSN: Middleware and software architecture for Internet distributed applications

Portail informatique

Aides EJB

Some pointers

How to solve the DERBY SQL error: ERRORCODE: 40000?

  • Depending on your security configuration, you might need to grant some right in the JDK security policies.
  • When you access the Derby Database, embedded in glassfish, like in the examples 31 and 32 with entity beans, you might get the following error message: ... Connection could not be allocated because: DERBY SQL error: ERRORCODE: 40000, SQLSTATE: XJ040 ...
  • In that case, make sure the file /etc/java-11-openjdk/security/java.policy (Ubuntu) contains the following line in the grant section: permission java.lang.RuntimePermission "getenv.SOURCE_DATE_EPOCH";

How to redeploy an EJB application?

  • If you try to deploy an application when one with the same name is already registed on the glassfish application server, you get an error message.
  • You can get the list of deployed application with the following command:
    asadmin list-applications
  • The recommended solution is to first undeploy your application, then generate the new one if you have modified it and deploy it again.
  • You can also use one of the following commands to redeploy your application, called myapplication in this example. Make sure to replace the name of your application and the path to the archive containing your application.
  • asadmin redeploy --name APPLICATION_NAME_HERE PATH_TO_THE_ARCHIVE_HERE.jar
    asadmin deploy --force=true PATH_TO_THE_ARCHIVE_HERE.jar

Dans les tests JUnit, erreur NamingException: Lookup failed avec Embedded Glassfish

  • Une cause possible est l'utilisation dans un entity bean des constructions de JAVA 1.8 comme la classe Optional pour écrire par exemple la ligne qui suit :
    this.name = Optional.ofNullable(name).orElseThrow(IllegalArgumentException::new);.

Dans les tests JUnit, erreur Could not resolve a persistence [...] in the scope of the module called [classes] avec Embedded Glassfish

  • Faites un essai en ajoutant le répertoire target/classes dans le CLASSPATH du conteneur embarqué en remplaçant l'instruction ec = EJBContainer.createEJBContainer(); par:
    Map properties = new HashMap(); properties.put(EJBContainer.MODULES, new File("target/classes")); ec = EJBContainer.createEJBContainer(properties);

Affichage de la collection d'une relation one-to-many d'un entity bean donne {IndirectList: not instantiated}

  • Cela est dû à la propriété de gestion du cache par défaut mise à lazy de gestion. Pour obtenir le « contenu » de la collection correspondant à la relation, le composant EJB peut appeler par exemple la méthode size() de la collection avant de renvoyer l'objet entity bean conteneur au client. L'appel de méthode provoque le « chargement » des objets entity bean de la collection.

Message « Got SQLException [...] Operation 'DROP CONSTRAINT' cannot be performed on object [...] because CONSTRAINT TURTABLE is dependent on that object »

  • Cela apparaît lorsque des objets entity beans sont supprimés qui possèdent une relation vers d'autres objets entity beans. Une tip est d'utiliser la méthode setXXX de la relation correspondante pour mettre la valeur null.