2012-04-30 1 views
0

Situation suivante. Je veux utiliser spring-data parce que j'aime le système Domain JpaRepository (interface).Spring-Data (JPA) avec EJB3 (javax) sans Springframework JBOSS AS7

Voici le MAIS, je ne veux pas utiliser le Spring-Framework lui-même. Je voudrais coller à la spécification javax. * Ejb3

J'essaie de configurer une configuration de projet.

J'ai un projet avec le spring-data-jpa qui représente la couche de pesristance. J'utilise @Stateless au lieu de ressorts @Service et @Inject au lieu de @Autowired (depuis que j'ai entendu il y a des synonymes. AccountService à l'intérieur du persistancelayer est seulement là pour tester purporses.

PersistanceModule(Eclipseproject) 
| 
|-com.ns.persistance 
| |-domain 
|  |-Account 
| |-repository 
|  |-AccountRepository (JpaRepositry interface) 
| |-test 
|  |-AccountService (which contains a method do save a user in the database) 

AccountRepository

public interface AccountRepository extends JpaRepository<Account, Long> { 

    Account findByUsername(String username); 

} 

service compte à des fins de test.

@Stateless 
public class AccountService { 

    @Inject 
    private AccountRepository ar; 

    public void createTestAccount() { 
     Account account = new Account(); 
     account.setUsername("testAccount"); 
     account.setPassword("sicheres passwort"); 
     account.setEmail("[email protected]"); 
     account.setCreationTime(new Date()); 
     account.setLastModificationDate(new Date()); 

     account = ar.save(account); 

    } 
} 

de Workjob pour tester les données de printemps

@Singleton 
public class SSService { 

    @EJB 
    AccountService as; 

    @Schedule(minute = "*/5", hour = "*", persistent = false) 
    public void doWork() { 

     System.out.println("WorkJob!!!!!!!"); 
     //as.createTestAccount(); 

    } 

} 

J'ai un ressort de données config.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans 
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
     http://www.springframework.org/schema/data/jpa 
     http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> 

    <jpa:repositories base-package="com.ns.persistence.repository" /> 

</beans> 

JBoss continue à me dire AccountService est NULL (Nullpointer). Je crois que j'ai oublié de mettre en place une configuration, mais je ne peux pas obtenir le coup d'oeil et googling continue de me procurer des solutions Springframework simples. Ma question: Qu'est-ce que j'ai manqué? Est-ce que les données de ressort fonctionnent avec EJB (javax) ou dois-je utiliser le springframework.

Répondre

0

Juste pour vous assurer que vous avez compris. Pour utiliser Spring Data JPA, vous devez utiliser le framework Spring. Vous n'avez pas besoin d'utiliser nécessairement le conteneur (configuration XML, configuration du conteneur), mais vous aurez besoin des fichiers JAR de Spring sur le chemin de votre classe d'applications. À partir de la version 1.1.0.RC1 (déjà publiée), le projet Spring Data JPA prend en charge l'exécution dans un conteneur CDI dont JBoss AS7 est une instance. Donc, avec Spring Data JPA de la version mentionnée ci-dessus, cela devrait fonctionner. Le fichier de configuration de Spring n'est pas nécessaire alors, seulement un beans.xml vide comme spécifié par CDI.

Si vous utilisez une version antérieure, vous devez écrire un code pour instancier-vous les instances de dépôt:

@Stateless 
class YourService { 

    @PersistenceContext 
    private EntityManager em; 

    private AccountRepository repository 

    @PostConstruct 
    public void init() { 
     RepositoryFactorySupport factory = new JpaRepositoryFactory(em); 
     this.repository = factory.getRepository(AccountRepository.class); 
    } 
} 

Il serait logique d'avoir ce code dans un composant commun et de laisser cette instance être injecté dans des services puis pour éviter de réécrire ce code d'installation dans chaque implémentation de service. Comme je l'ai mentionné ci-dessus: à partir des versions 1.1.0 à venir, cela fonctionnera hors de la boîte.