Witam,
powoli zaczynam sobie już włosy z głowy wyrywać, bo nie mogę sobie z tym problemem poradzić...
krótki wstęp: chciałbym połączyć się z bazą danych MySQL z poziomu jakiegoś DAO, pobrać cokolwiek i przekazać gdziekolwiek dalej do wyświetlenia
używam: Geronimo, openjpa, maven, jsf, ejb3
no i teraz tak:
persistence.xml (znajduje się w webapp/META-INF)
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="1.0">
<persistence-unit name="bazadb">
<class>pl.test.entity.User</class>
<properties>
<property name="openjpa.jdbc.SynchronizeMappings"
value="buildSchema"/>
<property name="openjpa.ConnectionURL"
value="jdbc:mysql://jakisURL.pl:3306/jakasBaza"/>
<property name="openjpa.ConnectionDriverName"
value="com.mysql.jdbc.Driver"/>
<property name="openjpa.ConnectionUserName"
value="userName"/>
<property name="openjpa.ConnectionPassword"
value="haslo"/>
</properties>
</persistence-unit>
</persistence>
applicationContext.xml
(...)
<bean id="userManagementDAO" class="pl.test.dao.UserManagementDAOBean"/>
<bean name="userFaces" class="pl.test.faces.UserFaces">
<property name="userManagementDAO">
<ref bean="userManagementDAO"/>
</property>
</bean>
faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
version="1.2">
<application>
<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>
<managed-bean>
<managed-bean-name>userFaces</managed-bean-name>
<managed-bean-class>pl.test.faces.UserFaces</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>userManagementDAO</property-name>
<value>#{userManagementDAO}</value>
</managed-property>
</managed-bean>
</faces-config>
geronimo-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.1"
xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.1"
xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.1">
<environment>
<moduleId>
<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<version>${version}</version>
<type>war</type>
</moduleId>
</environment>
</web-app>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>test</display-name>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>facelets.REFRESH_PERIOD</param-name>
<param-value>2</param-value>
</context-param>
<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.jsp</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
</web-app>
i teraz tak... jakieś JSP spokojnie pobiera sobie dane z UserFaces, to zaś bierze dane z UserManagementDAOBean (o ile na sztywno w tym ostatnim podam np. jakiegoś string'a do przekazania). Jeśli zaś w tym DAO próbuję pobrać coś z bazy i przekazać dalej - nie mogę...
UserFaces
(...)
UserManagementDAO userManagementDAO;
public String login = "";
public void setLogin(String login) {
this.login = login;
}
public String getLogin() {
User obiekt = userManagementDAO.getOneUser("Karol");
return obiekt.getLogin();
}
public void setUserManagementDAO(UserManagementDAO userManagementDAO) {
this.userManagementDAO = userManagementDAO;
}
(...)
UserManagementDAOBean
(...)
@Stateless
@Remote
public class UserManagementDAOBean implements UserManagementDAO {
@PersistenceContext(unitName = "bazadb")
private EntityManager em;
public User getOneUser(String name) {
Query query = em.createNamedQuery("getOneUser");
query.setParameter("name", name);
User userEntity = (User) query.getSingleResult();
System.out.println("user: " + userEntity.getFirstName());
return userEntity;
}
}
User (encja)
(...)
@NamedQueries(value= {
@NamedQuery(name = "getOneUser",
query = "SELECT Object(e)"
+ " FROM User e"
+ " WHERE e.firstName = :name")
})
@Entity
@Table (name="TABELA_USEROW")
public class User {
private Long idUser;
private String login;
private String firstName;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getIdUser() {
return idUser;
}
(...)
Ogólnie to gdy wykonam powyższy kod dostaje wyjątek java.lang.NullPointerException, jakoby przekazywana wartość była null'em - czyli nic nie pobrano z bazy (a w bazie na pewno są dane do pobrania).
Gdy robie jakieś celowe błędy w danych dostępowych do bazy w persistence.xml to nie wyrzuca żadnego błędu, stąd pomysł, że w ogóle z bazą nie próbuje się połączyć (nie może znaleźć persistence.xml / coś pominąłem?)
Będę wdzięczny za każdą pomoc.