2014-02-28 12 views
6

Ich habe Probleme nach der Aktualisierung einer Anwendung, die in WebSphere und Netweaver läuft in JBoss6.2 EAP ausgeführt wird.Spring @PostConstruct nicht feuern in JBoss7

Ich habe festgestellt, dass ein federgeführtes @Repository (org.springframework.stereotype.Repository) mit einer init() -Methode, die mit @PostConstruct (javax.annotation.PostConstruct) annotiert wurde, nicht die init() -Methode ausführen lässt wenn in JBossEAP 6.2.0 bereitgestellt.

Die Klasse sieht ungefähr wie folgt aus:

 package com.company.productname.api.dao.impl; 


     // ... imports removed .... 

     @Repository 
     public class UserRoleDao extends AbstractBaseDao { 

      private static final Log LOG = LogFactory.getLog(UserRoleDao.class); 

      private boolean testInitInvoked = false; 


      // .... some code removed .... 

      /** 
      * Prepare the caches used to lookup market roles 
      */ 
      @PostConstruct 
      protected void init() { 
      testInitInvoked = true; 
      if (LOG.isDebugEnabled())LOG.debug("UserRoleDao.init() method called"); 

         // .. . . . some code removed ...... 
       } 


      @Override 
      public Mask getMask(final String aMaskName) { 
       LOG.debug("getRoleMask entered, testInitInvoked = [" + testInitInvoked + "]- aMaskName = " + aMaskName); 

       Mask myMask = masksByName.map().get(aMaskName); 

       if (myMask != null) { 
        myMask.setMembers(this.getMembersForMaskId(myMask.getId())); 
       } 

       LOG.debug("getRoleMask returning - myMask = " + myMask); 

       return myMask; 
      } 
     } 

Was ich von der Protokollierung sehen kann, ist, dass die Protokollierung in der init-Methode ist nicht angemeldet zu werden, und der Wert der testInitInvoked boolean bleibt als falsch, wenn Die Klasse wird von der Anwendung verwendet (eine lange Zeit nach dem Start).

Die obige Klasse ist in einem Jar gebündelt in den Krieg/WEB-INF/lib.

Ich kann aus der Spring-Protokollierung sehen, dass die UserRoleDao-Klasse in die Klasse mit einer @Autowired-Annotation automatisch in die Klasse referenziert wird.

Die Spring-Jars werden in JBoss unter JBOSS_HOME \ modules \ com \ company \ thirdparty \ main installiert und von der Datei module.xml korrekt referenziert (da die meisten Apps federgesteuert sind, weiß ich, dass sie korrekt referenziert sind).

Die Feder Kontext verwendet Klasse Scannen wie im folgenden Auszug aus der Feder Kontext XML-Datei angezeigt:

<context:component-scan base-package="com.company.productname.api" /> 

Also, das Merkwürdige ist, dass der Frühling ist in der Lage, die UserRoleDao Klasse in die Service-Klasse autowire dass verwendet es, aber @PostConstruct scheint ignoriert zu werden.

Ich habe versucht, die Frühlingsgläser in das Verzeichnis WEB-INF \ lib zu verschieben (Ich fand bei früheren Ausgaben rund um Hibernate, dass Anmerkungen nicht gescannt wurden, wenn in den JBOSS_HOME \ -Modulen auf jars verwiesen und in die WEB- INF \ lib Verzeichnis behoben das).

Hat schon jemand anderes ein ähnliches Problem bemerkt? (und eine Lösung gefunden!)

Die @PostConstruct-Init-Methode wird ausgelöst, wenn sie in WebSphere & Netweaver mit denselben Spring-Versions-JARs implementiert wird.

Entschuldigung, wenn ich dies in der falschen Gegend gepostet habe, lass es mich wissen und ich werde es verschieben.

Danke,

Versionen:

JBoss: EAP 6.2.0.GA (gebaut auf AS 7.3.0)

Spring: 3.1.1

+2

Könnten Sie welche Gläser in Ihrem WEB-INF/lib veröffentlichen? Stellen Sie sicher, dass sich dort kein API-Jar mit der Anmerkung "@ PostConstruct" befindet. JBoss kann sehr wählerisch beim Laden von Klassen und Klassen sein. –

+0

Hallo M. Deinum, Entschuldigung für die Verzögerung bei der Antwort, ich habe keine Benachrichtigung bekommen, dass jemand geantwortet hat. Ich habe festgestellt, dass, wenn ich meine Frühling Gläser in meinem Verzeichnis WEB-INF/lib, und entfernen Sie sie aus den Modulen, dann die @ PostConstruct Annotation funktioniert. –

Antwort

2

Dank Vorschlag von M Deinin konnte ich dieses Problem beheben. Ich musste die Frühlingsgläser in mein Verzeichnis WEB-INF/lib legen und sie aus dem Modulverzeichnis entfernen.

2

Hinzufügen der Abhängigkeits

<module name="javax.annotation.api" export="true"/>

zum Federmodul arbeitet für mich.

+0

Arbeitete für mich (JBoss 6.4 und Spring Boot 1.2.7.RELEASE). Ich hatte das gleiche Problem. – Cleankod