Arndt Schönbergs Weblog

Freitag Mai 18, 2018

Spooky Exceptions (8) - Exception Description: Entity class [class ... ] has no primary key specified. It should define either an @Id, @EmbeddedId or an @IdClass

Umgebung

  • Wildfly 12
  • EE7
  • Eclipselink

Situation

Bei der Prüfung der persistence.xml beim Hochfahren des Servers wird folgende Exception geworfen:
 
Internal Exception: Exception [EclipseLink-7161] (Eclipse Persistence Services - 2.6.4.v20160829-44060b6): 
org.eclipse.persistence.exceptions.ValidationException
Exception Description: Entity class [class ...] has no primary key specified. It should define either an @Id, @EmbeddedId or an @IdClass. 
If you have defined PK using any of these annotations then make sure that you do not have mixed access-type 
(both fields and properties annotated) in your entity class hierarchy.
In unserem Fall lag dies daran, dass es sich bei der betroffenen Entität um eine Entität handelte, die aus einer anderen abgeleitet ist. Die Parent-Entity liegt in einer ausgelagerten jar Datei, die neben der Projekt-Ejb Datei verwendet wurde. In der application.xml wurde aber vergessen, dies ausgelagerte Datei als ejb-Modul einzutragen. Dadurch konnte der Scanner die übergeordnete Klasse nicht erkennen und hat die in ihr enthaltene Annotation nicht auswerten können.

Montag Apr 09, 2018

Werkzeuge zur Erhaltung der Softwarearchitektur - weitere Tools - Teil 15

Weitere Tools

In diesem Blog folgt zum Abschluss der Serie eine Auflistung von Werkzeugen / Frameworks, die ebenfalls einen Bezug zum Thema Architekturerhaltung haben.
  • JDepend
  • NCSS (veraltet)
  • SLOCCCount
  • Maven
  • IDE
  • JEE - gibt eine technische Schichtentrennung vor
  • FylWay (DB-Versionierung)
  • DB-Integrität
  • Code-Review
  • Sicherheit
  • OWASP (Sicherheit)
  • ZAProxy (Pen-Test)
    • Lizenzkostenpflichtig
  • Structure 101
  • Sonargraph
  • Alle Teile der Serie zu Architekturerhaltung in Java

    Freitag Sep 22, 2017

    Spooky Exceptions (7) - The tag named inputFile from namespace http://xmlns.jcp.org/jsf/html has a null handler-class defined

    Umgebung

    • Wildfly 10
    • EE7

    Situation

    Es kommt folgende ConfigurationException beim Start des Wildfly:
     
    12:12:32,109 SEVERE [javax.enterprise.resource.webcontainer.jsf.config] (ServerService Thread Pool -- 88) 
       Critical error during deployment: : com.sun.faces.config.ConfigurationException: 
       The tag named inputFile from namespace http://xmlns.jcp.org/jsf/html has a null handler-class defined
    	at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.processHandlerClass(FaceletTaglibConfigProcessor.java:422)
    	at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.processTags(FaceletTaglibConfigProcessor.java:378)
    	at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.processTagLibrary(FaceletTaglibConfigProcessor.java:321)
    	at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.process(FaceletTaglibConfigProcessor.java:270)
    	at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:441)
    	at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:227)
    	at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:187)
    	at io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:200)
    	at io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:171)
    	at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
    	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
    	at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    

    Ursache

    Es wurde eine JSF Implementierung (jar) mit der Anwendung deployed. Diese stört sich mit der durch WIldfly bereitgestellten. Bei der Verwendung von MyEclipse geschieht dies häufiger, da MyEclipse das JSF jar häufig in den deployment descriptor aufnimmt.

    Ursache

    Das Deployment des JSF jar verhindern ;-)

    Dienstag Feb 21, 2017

    Spooky Exceptions (6) java.lang.NullPointerException - ....MergeManager.registerObjectForMergeCloneIntoWorkingCopy(MergeManager.java:1054)

    Umgebung

    • Wildfly 10
    • EE7
    • Postgres
    • Eclipselink

    Situation

    Es kommt folgende NPE von Eclipselink:
     
    1:10:10,476 INFO  [stdout] (default task-32) java.lang.NullPointerException
    2017-02-20 11:10:10,485 INFO  [stdout] (default task-32)     at 
    org.eclipse.persistence.internal.sessions.MergeManager.registerObjectForMergeCloneIntoWorkingCopy(
    MergeManager.java:1054) 
    ~[eclipselink.jar!/:2.6.4.v20160829-44060b6]
    2017-02-20 11:10:10,485 INFO  [stdout] (default task-32)     at 
    org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfCloneIntoWorkingCopy(
    MergeManager.java:564) 
    ~[eclipselink.jar!/:2.6.4.v20160829-44060b6]
    2017-02-20 11:10:10,485 INFO  [stdout] (default task-32)     at 
    org.eclipse.persistence.internal.sessions.MergeManager.mergeChanges(MergeManager.java:313) 
    
    Auch dies ist leider wieder eine Meldung, die die eigentlich Ursache verschleiert. Der Grund für diese NPE ist, dass eine Entität nicht in der persistence.xml angegeben wurde bzw. von einer automatischen Erkennung nicht registriert wurde.

    Beachtet auch die Ableitungshierarchie - es müssen alle Entitäten eingetragen sein!

    Dienstag Feb 14, 2017

    Spooky Exceptions (5) Caused by: org.postgresql.util.PSQLException: ERROR: column "date_start" is of type date but expression is of type character varying

    Umgebung

    • Wildfly 10
    • EE7
    • Postgres
    • Eclipselink

    Situation

    Wenn wir versuchen ein abhängiges Objekt über Datenbankattribute vom Typ Date zu referenzieren (mindestens eines), kann dies zu Problemen führen. Wir haben folgende Abhängigkeit
     
        @JoinColumns({
            @JoinColumn(name = "mandator_id", referencedColumnName = "mandator_id", insertable = true, updatable = true),
            @JoinColumn(name = "date_start", referencedColumnName = "date_start", insertable = true, updatable = true)
        })
        @ManyToOne
        private AccountingPeriod accountingPeriodEnd = null;
    
    Es wird also auf ein Objekt vom Typ AccountingPeriod verwiesen. Beide Attribute für die Verbindung sind schreibend definiert. Versucht man nun diesen Wert mit null zu persistieren, kann es zu folgender Fehler-Meldung kommen
     
    Caused by: org.postgresql.util.PSQLException: ERROR: column "date_start" is of type date but expression is of type character varying
    
    Innerhalb des Mappings erkennt die JPA nicht den korrekten Typ. Je nach Datenbank, kann dies zu Problemen führen.

    Lösung

    Es muss das Date-Attribut "ausgelagert" werden. Hierfür definieren wir
     
        @Temporal(TemporalType.TIMESTAMP)
        @Column(name = "date_start")
        private Date dateEnd = null;
    
        @JoinColumns({
            @JoinColumn(name = "mandator_id", referencedColumnName = "mandator_id", insertable = true, updatable = true),
            @JoinColumn(name = "date_start", referencedColumnName = "date_start", insertable = false, updatable = false)
        })
        @ManyToOne
        private AccountingPeriod accountingPeriodEnd = null;
    
    Im entsprechneden Setter müssen wir das korrekte Befüllen des Date-Attribits sicherstellen
     
        public AccountingPeriod getAccountingPeriodEnd() {
            return this.accountingPeriodEnd;
        }
        public void setAccountingPeriodEnd(AccountingPeriod value) {
            this.accountingPeriodEnd = value;
            if (value != null) {
                this.setDateEnd(value.getDateStart());
            } else {
                this.setDateEnd(null);
            }
        }
    
        protected Date getDateEnd() {
            return this.dateEnd;
        }
        private void setDateEnd(Date value) {
            this.dateEnd = value;
        }
    
    Hierdurch ist der Typ eindeutig definiert und JPA hat keine Probleme mehr.

    Calendar

    Feeds

    Search

    Links

    Navigation