Hallo,
ich schau hier schon ne ganze Weile gerne rein und meistens passt auch irgendein Post zu meinem Problem. Diesmal leider nicht.
Ich setzte mich gerade mit JEE5 auseinander. Hatte das im Studium schon angekratzt aber nur Basics alla "Es gibt da was".
Momentan nutze ich JBoss 5.0.0 GA und Eclipse(Beim 4.2.3 gabs JNDI-Probleme mit dem einbinden von EJB3 in Servlets, sowohl DI als auch InitialContext lookup ging nicht ohne Sonderkonfiguration).
Ich hab aus Spaß eine Stateful Session Bean geschrieben, welche Methoden zum lesen und schreiben (via JPA) von Daten in eine MySQL Datenbank bereitstellt. Das ganze funktioniert auch wunderbar mit einem Client per remote Interface. Möchte ich diese Bean nun in einem Servlet lokal nutzen geht das im Prinzip auch (Leider hat DI nicht geklappt, aber lookup funktioniert) solange ich die Methoden nutze, welche keinen Rückgabewert haben oder halt Standard (z.B. String, boolean,...). Sobald ich ein Objekt einer selbstgeschriebenen Klassen zurückgebe bekommen ich eine ClassCastException welche mir sagt, dass ich nicht von meinPack.meineKlasse nach meinPack.meineKlasse casten kann. und das versteh ich mal gar nicht. Benutze die gleichen Interfaces und Packages in Jar und War.
Also hier der Code.
Local Interface:
Statefull Session Bean Implementierung
Servlet in dem die Bean genutzt werden soll
Fehler:
Der Fehler kommt bei UserTO user = tms.getUser()
ich schau hier schon ne ganze Weile gerne rein und meistens passt auch irgendein Post zu meinem Problem. Diesmal leider nicht.
Ich setzte mich gerade mit JEE5 auseinander. Hatte das im Studium schon angekratzt aber nur Basics alla "Es gibt da was".
Momentan nutze ich JBoss 5.0.0 GA und Eclipse(Beim 4.2.3 gabs JNDI-Probleme mit dem einbinden von EJB3 in Servlets, sowohl DI als auch InitialContext lookup ging nicht ohne Sonderkonfiguration).
Ich hab aus Spaß eine Stateful Session Bean geschrieben, welche Methoden zum lesen und schreiben (via JPA) von Daten in eine MySQL Datenbank bereitstellt. Das ganze funktioniert auch wunderbar mit einem Client per remote Interface. Möchte ich diese Bean nun in einem Servlet lokal nutzen geht das im Prinzip auch (Leider hat DI nicht geklappt, aber lookup funktioniert) solange ich die Methoden nutze, welche keinen Rückgabewert haben oder halt Standard (z.B. String, boolean,...). Sobald ich ein Objekt einer selbstgeschriebenen Klassen zurückgebe bekommen ich eine ClassCastException welche mir sagt, dass ich nicht von meinPack.meineKlasse nach meinPack.meineKlasse casten kann. und das versteh ich mal gar nicht. Benutze die gleichen Interfaces und Packages in Jar und War.
Also hier der Code.
Local Interface:
Code:
package de.sge.taskmanager.interfaces;
import java.util.Collection;
import java.util.Date;
import javax.ejb.Local;
import de.sge.taskmanager.exceptions.IncorrectLoginInformationException;
import de.sge.taskmanager.exceptions.NoPermissionException;
import de.sge.taskmanager.exceptions.NoUniqueResultFoundException;
import de.sge.taskmanager.exceptions.WrongPasswordException;
import de.sge.taskmanager.transferObjects.ProjectTO;
import de.sge.taskmanager.transferObjects.TaskTO;
import de.sge.taskmanager.transferObjects.UserTO;
@Local
public interface TaskManagerServiceLocal {
public boolean login(String username,String password)throws NoUniqueResultFoundException,
IncorrectLoginInformationException,
WrongPasswordException;
public String getNameOfUser()throws NoPermissionException;
public UserTO getUser()throws NoPermissionException;
public void changePassword(String oldPassword,String newPassword)throws NoPermissionException,WrongPasswordException;
public void createTask(String name,String desc,Integer pid,Date dueDate)throws NoPermissionException;
public Collection<TaskTO> getAllTasks()throws NoPermissionException;
public void deleteTask(Integer tid)throws NoPermissionException;
public void changeTaskState(Integer tid,String state)throws NoPermissionException;
public void createProject(String name,String desc)throws NoPermissionException;
public Collection<ProjectTO> getAllProjects()throws NoPermissionException;
public void deleteProject(Integer pid)throws NoPermissionException;
public Collection<TaskTO> getTaskForProject(Integer pid)throws NoPermissionException;
}
Statefull Session Bean Implementierung
Code:
package de.sge.taskmanager.services;
import java.sql.Time;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.sql.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.apache.log4j.Logger;
import de.sge.taskmanager.exceptions.*;
import de.sge.taskmanager.interfaces.TaskManagerServiceLocal;
import de.sge.taskmanager.interfaces.TaskManagerServiceRemote;
import de.sge.taskmanager.persistence.Project;
import de.sge.taskmanager.persistence.Task;
import de.sge.taskmanager.persistence.User;
import de.sge.taskmanager.transferObjects.ProjectTO;
import de.sge.taskmanager.transferObjects.TaskTO;
import de.sge.taskmanager.transferObjects.UserTO;
@Stateful(name="TaskManagerService")
public class TaskManagerServiceBean implements TaskManagerServiceRemote,TaskManagerServiceLocal {
Logger log;
@PersistenceContext
EntityManager em;
User user = null;
@PostConstruct
public void ejbCreate() {
log = Logger.getLogger("TaskManagerServiceBean.class");
}
public boolean login(String username, String password)
throws NoUniqueResultFoundException,
IncorrectLoginInformationException, WrongPasswordException {
User u = null;
List users = em.createQuery("from User u where u.username =:username")
.setParameter("username", username).getResultList();
if (users.size() > 1) {
log.error("No unique Result Found for User: " + username
+ " and Pass: " + password);
throw new NoUniqueResultFoundException();
} else if (users.size() <= 0) {
log.error("Incorrect Login Information for User: " + username
+ " and Pass: " + password);
throw new IncorrectLoginInformationException();
} else {
u = (User) users.get(0);
if (u.getPassword().equals(password)) {
user = u;
return true;
} else {
user = null;
throw new WrongPasswordException();
}
}
}
public String getNameOfUser() throws NoPermissionException {
if (user != null) {
return user.getName();
} else {
throw new NoPermissionException();
}
}
public UserTO getUser() throws NoPermissionException {
if (user != null) {
return user.generateUserTO();
} else {
throw new NoPermissionException();
}
}
public void createProject(String name, String desc) throws NoPermissionException {
if (user != null) {
Project project = new Project();
project.setP_name(name);
project.setDescription(desc);
project.setCreationDate(new Date(new java.util.Date().getTime()));
project.setCreationTime(new Time(new java.util.Date().getTime()));
em.persist(project);
} else {
throw new NoPermissionException();
}
}
public void createTask(String name, String desc, Integer pid,
java.util.Date dueDate) throws NoPermissionException {
if (user != null) {
Task task = new Task();
task.setT_name(name);
task.setDescription(desc);
if (pid != null) {
task.setProject((Project) em.createQuery(
"from Project p where p.pid=:pid").setParameter("pid",
pid).getSingleResult());
}
task.setCreationDate(new Date(new java.util.Date().getTime()));
task.setCreationTime(new Time(new java.util.Date().getTime()));
task.setDueDate(new Date(dueDate.getTime()));
task.setDueTime(new Time(dueDate.getTime()));
task.setTaskOwner(user);
task.setStatus("open");
em.persist(task);
} else {
throw new NoPermissionException();
}
}
public Collection<ProjectTO> getAllProjects() throws NoPermissionException {
if(user!=null){
return null;
}
else{
throw new NoPermissionException();
}
}
public Collection<TaskTO> getAllTasks() throws NoPermissionException {
if (user != null) {
ArrayList<TaskTO> collection = new ArrayList<TaskTO>();
Iterator taskIterator = user.getTasks().iterator();
while(taskIterator.hasNext()){
Task task = (Task) taskIterator.next();
collection.add(task.generateTaskTO());
}
return collection;
} else {
throw new NoPermissionException();
}
}
public void changePassword(String oldPassword, String newPassword)
throws NoPermissionException, WrongPasswordException {
if(user!=null){
if(user.getPassword().equals("oldPassword")){
user.setPassword(newPassword);
em.refresh(user);
}
else{
throw new WrongPasswordException();
}
}
else{
throw new NoPermissionException();
}
}
public void changeTaskState(Integer tid, String state)
throws NoPermissionException {
if(user!=null){
Iterator taskIT = user.getTasks().iterator();
while(taskIT.hasNext()){
Task t = (Task) taskIT.next();
if(t.getTid()==tid){
t.setStatus(state);
em.refresh(t);
}
}
}
else{
throw new NoPermissionException();
}
}
public void deleteProject(Integer pid) throws NoPermissionException {
if(user!=null){
}
else{
throw new NoPermissionException();
}
}
public void deleteTask(Integer tid) throws NoPermissionException {
if(user!=null){
Iterator taskIT = user.getTasks().iterator();
while(taskIT.hasNext()){
Task t = (Task) taskIT.next();
if(t.getTid()==tid){
em.remove(t);
}
}
}
else{
throw new NoPermissionException();
}
}
public Collection<TaskTO> getTaskForProject(Integer pid)
throws NoPermissionException {
if(user!=null){
}
else{
throw new NoPermissionException();
}
return null;
}
}
Servlet in dem die Bean genutzt werden soll
Code:
package de.sge.taskmanager.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import de.sge.taskmanager.exceptions.IncorrectLoginInformationException;
import de.sge.taskmanager.exceptions.NoPermissionException;
import de.sge.taskmanager.exceptions.NoUniqueResultFoundException;
import de.sge.taskmanager.exceptions.WrongPasswordException;
import de.sge.taskmanager.interfaces.TaskManagerServiceLocal;
import de.sge.taskmanager.transferObjects.UserTO;
/**
* Servlet implementation class for Servlet: LoginServlet
*
*/
public class LoginServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
TaskManagerServiceLocal tms;
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
}
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
work(request,response);
}
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
work(request,response);
}
private void work(HttpServletRequest request, HttpServletResponse response){
try {
InitialContext ctx = new InitialContext();
tms = (TaskManagerServiceLocal)ctx.lookup("TaskManagerService/local");
String username = request.getParameter("userName");
String password = request.getParameter("password");
tms.login(username, password);
UserTO user= tms.getUser();
PrintWriter out = response.getWriter();
out.println(user.getPrename());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoPermissionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoUniqueResultFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IncorrectLoginInformationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (WrongPasswordException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Fehler:
Code:
14:42:49,452 ERROR [[LoginServlet]] Servlet.service() for servlet LoginServlet threw exception
java.lang.ClassCastException: de.sge.taskmanager.transferObjects.TaskTO cannot be cast to de.sge.taskmanager.transferObjects.TaskTO
at de.sge.taskmanager.servlets.LoginServlet.work(LoginServlet.java:83)
at de.sge.taskmanager.servlets.LoginServlet.doPost(LoginServlet.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:828)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:601)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
15:05:21,841 ERROR [[LoginServlet]] Servlet.service() for servlet LoginServlet threw exception
java.lang.ClassCastException: de.sge.taskmanager.transferObjects.TaskTO cannot be cast to de.sge.taskmanager.transferObjects.TaskTO
at de.sge.taskmanager.servlets.LoginServlet.work(LoginServlet.java:83)
at de.sge.taskmanager.servlets.LoginServlet.doPost(LoginServlet.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:828)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:601)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Der Fehler kommt bei UserTO user = tms.getUser()
Zuletzt bearbeitet: