# [JSF] Zugriff auf Bean (Eclispe,JBoss)



## Smoothi (18. Sep 2012)

EDIT: Das Problem von einer JSF-Seite auf eine Bean im selben Projekt zuzugreifen hat sich geklärt. Neustart von Eclipse, Server und Redeploy hat geholfen. oO

Nunja... mein eigentliches Problem ist.

Wie greife ich mit JSF auf eine Bean mittels CDI zu, wenn diese sich in einem anderen Projekt befindet?


----------



## Templarthelast (18. Sep 2012)

Geht nicht. Bzw. nicht ohne weiteres. Das Bean muss schon im gleichen Projekt sein.


----------



## Smoothi (18. Sep 2012)

liegt das am CDI?

Wir haben an der Uni mal ein Projekt mit ManagedBeans gehabt. Dabei hatten wir das Projekt mit den Beans einfach dem BuildPath und dem Deployment Assembly mitgegeben und es klappte. 

Klappte aber auch nicht -.-


----------



## Templarthelast (19. Sep 2012)

Ist das CDI bean mit @Named versehen? Sonst kann es nicht direkt von JSF zugegeriffen werden. Ansonsten könntest du das CDI bean auch in eine ManageBean injecten und dann über dieses die Daten für JSF bereitstellen.


----------



## Smoothi (19. Sep 2012)

Ach ich mach das in einem Projekt... ich find das sowieso schöner als mit zig Projekten zu hantieren. 

Jedoch bekomm ich jetzt:
JBAS016069: Error injecting persistence unit into CDI managed bean. Can't find a persistence unit named in deployment bank-swt.war

Meine persistence.xml befindet sich im WebContent/META-INF/persistence.xml und sieht so aus:

```
<persistence xmlns="http://java.sun.com/xml/ns/persistence"  
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"  
             version="2.0">  
	<persistence-unit name="BankUnit" transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<jta-data-source>java:jboss/datasources/PostgresDS</jta-data-source> 
		
		<properties>		
			<property name="hibernate.hbm2ddl.auto" value="create"/>
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
			<property name="hibernate.show_sql" value="false"/>
			<property name="hibernate.format_sql" value="false"/>
			<property name="hibernate.use_sql_comments" value="false"/>
			<property name="hibernate.archive.autodetection" value="class"/>
		</properties>
	</persistence-unit>
</persistence>
```

irgend eine Idee? Ich kann nicht verstehen wie alle so auf Eclipse abgehen, ich hab damit nur Probleme...wär ich nicht dazu gezwungen würde ich wieder NetBeans nehmen. ^^


----------



## Templarthelast (19. Sep 2012)

Das hat weniger mit eclipse als mit deiner Hibernatekonfiguration zu tun. Wie injectest du den den EntityManager?

Ist überhaupt eine Datasource im Application/Servletcontainer angelegt?


----------



## Smoothi (19. Sep 2012)

Natürlich. Die Source ist da. 

Ich hab die Entity-Klassen auch aus dem ursprünglichem Projekt rüberkopiert. 
Beim ursprünglichen Projekt ging das noch, jetzt wird nichtmal mehr die Tabellenstruktur angelegt.

Also Entities und persistence.xml wurde aus dem Ursprungsprojekt übernommen.

Meine TestBean sieht wie folgt aus:

```
@SuppressWarnings("serial")
@Named("bankBean")
@SessionScoped
public class BankBean implements Serializable {
	@PersistenceContext
	private EntityManager entityManager;
	
	public BankBean() {
	}
	
	public Bank createBank(Bank bank) {
		try {
			entityManager.persist(bank);
			return bank;
		} catch(Exception e) {
			System.err.println("Fehler in createBank" + e);
			return null;
		}		
	}
	
	public String getTest() {
		Bank sparkasse = new Bank();
		sparkasse.setName("Sparkasse");
		sparkasse.setSortCode(12345);
		sparkasse = createBank(sparkasse);
		return "test";
	}
}
```


----------



## Templarthelast (19. Sep 2012)

Ich würde es dann mal mit einer explizierten PersistanceUnit versuchen: 
	
	
	
	





```
@PersistenceContext(unitName="JPAUnit")
```


----------



## Smoothi (19. Sep 2012)

bringt den gleichen Fehler...

die Tabellenstruktur müßte doch eigentlich bei "create" nach dem deploy auch angelegt werden, wenn das Projekt nur Entities enthält


----------



## Smoothi (19. Sep 2012)

vielleicht liegts an meiner Struktur?

Ich hab ein neues JSF-Project erstellt.

- JavaSource
--- <meine Klassen>
- ant
- WebContent
--- META-INF
------ MANIFEST.MF
------ persistence.xml
--- WEB-INF
------ lib
------ beans.xml
------ faces-config.xml
------ web.xml
--- <XHTML-Seiten>


----------



## jwiesmann (19. Sep 2012)

Die Persistence.xml muss in dem Project vorhanden sein, wo die Entities zu finden sind.
Ansonsten muss du explizit in der persistence.xml das JAR-File mit Entities angeben.
[XML]
	<persistence-unit name="BankUnit" transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<jta-data-source>java:jboss/datasources/PostgresDS</jta-data-source> 
                <jar-file>myEntities.jar</jar-file>		
		<properties>		
			<property name="hibernate.hbm2ddl.auto" value="create"/>
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
			<property name="hibernate.show_sql" value="false"/>
			<property name="hibernate.format_sql" value="false"/>
			<property name="hibernate.use_sql_comments" value="false"/>
			<property name="hibernate.archive.autodetection" value="class"/>
		</properties>
	</persistence-unit>
[/XML]


----------



## Smoothi (19. Sep 2012)

ah ich habs 

ich mußte unter ProjectFacets "JPA" aktivieren, dann wurde der META-INF-Ordner auch im Klassenverzeichnis angelegt. Per Hand gings nicht. 

EDIT:






Das ist der Punkt wo mich Eclipse wahnsinnig macht. Wie bekomm ich raus woher die Kreuze kommen? Im Quellcode is alles ok. -.-Deployen kann ich es nun auch und die Tabellenstruktur wird angelegt.

Jedoch kann ich noch keine Transaktion ausführen:
javax.persistence.TransactionRequiredException: JBAS011469: Transaction is required to perform this operation (either use a transaction or extended persistence context)

EDIT2: ok..die Exception lies sich durch

```
@Resource private UserTransaction utx;
```
beheben. 

Eine andere Möglichkeit ohne UserTransaction wäre mir aber auch ganz lieb.


----------



## Smoothi (19. Sep 2012)

ok die Kreuzle sind weg... hab JPA nochmal rausgeschmissen und nochmal neu reingelegt. 

Jetzt wäre noch eine Möglichkeit toll wie ich auf das UserTransaction-Objekt verzichten könnte

Dann kann ich endlich durchstarten


----------

