tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
1644
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Urmel103 Urmel103 ist offline Rookie
    Registriert seit
    Sep 2007
    Beiträge
    7
    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:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    
    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()
    Geändert von Urmel103 (12.02.09 um 16:27 Uhr)
     

  2. #2
    Avatar von Oliver Gierke
    Oliver Gierke Oliver Gierke ist offline Mitglied Rubin
    Registriert seit
    Dec 2003
    Ort
    Mannheim
    Beiträge
    1.457
    Mehrere Sachen:

    1) Zu deiner Frage: deployst du das EAR und die Webapp getrennt? Die Exception könnte daher kommen, dass die serialVersionUID in den Klassen in den JARs unterschiedlich ist.

    2) Warum der Lookup übder den InitialContext? Du kannst dir die SessionBean direkt injecten lassen.

    3) Immer die gleiche Exception an jeder Methode ist ein Codesmell. Security ist ein Aspekt, sollte daher (in der EJB3 Welt) mit Interceptors implementiert werden. Aus diesem Grund sollten SecurityExceptions auch unchecked Exceptions sein, so kannst du sie zentral behandeln OHNE sämtlichen Code mit den Exceptions zu nerven.

    4) Security implementiert man nicht selbst . Das eins der typischen Themen, die irgendwie jedes Projekt neu und selbst machen will (das Thema hat mittlerweile schon "Webframeworks" überholt). Entweder nutzt man den Container oder dedizierte SecurityFrameworks wie SpringSecurity. Ich finds amüsant, wie man immer meint, Dinge selbst besser implementieren zu können, als die vielen anderen die da schon ewig Zeit investiert haben .

    Gruß
    Ollie
     
    In theory, there is no difference between theory and practice. In practice, there is!

    www.olivergierke.de

  3. #3
    Urmel103 Urmel103 ist offline Rookie
    Registriert seit
    Sep 2007
    Beiträge
    7
    Zitat Zitat von Oliver Gierke Beitrag anzeigen

    1) Zu deiner Frage: deployst du das EAR und die Webapp getrennt? Die Exception könnte daher kommen, dass die serialVersionUID in den Klassen in den JARs unterschiedlich ist.
    Ich hab beides probiert. Jar und War ohne EAR sowie EJB-Modul + WebModul in EAR.
    War kein Unterschied. Die serielVersionUIDs sind gleich. Das ClassCastProblem
    ist immernoch da. Hast du noch eine andere Idee? Bin schier am Verzweifeln.


    Zitat Zitat von Oliver Gierke Beitrag anzeigen
    2) Warum der Lookup übder den InitialContext? Du kannst dir die SessionBean direkt injecten lassen.
    Naja weil es nicht ging. Wohlgemerkt ging. Nach deinem Post hab ich es nochmal umgestellt auf DI(um den Fehler zu Posten) und siehe da es geht. Und das ohne irgendetwas drumherum geändert zu haben. einfach InitialContext raus und @EJB rein. und es geht.Naja mir solls recht sein.

    Zitat Zitat von Oliver Gierke Beitrag anzeigen


    3) Immer die gleiche Exception an jeder Methode ist ein Codesmell. Security ist ein Aspekt, sollte daher (in der EJB3 Welt) mit Interceptors implementiert werden. Aus diesem Grund sollten SecurityExceptions auch unchecked Exceptions sein, so kannst du sie zentral behandeln OHNE sämtlichen Code mit den Exceptions zu nerven.
    Was sind Interceptoren? Muss ich mir mal anschauen.
    unchecked Exceptions ok jep mach ich.

    Zitat Zitat von Oliver Gierke Beitrag anzeigen

    4) Security implementiert man nicht selbst . Das eins der typischen Themen, die irgendwie jedes Projekt neu und selbst machen will (das Thema hat mittlerweile schon "Webframeworks" überholt). Entweder nutzt man den Container oder dedizierte SecurityFrameworks wie SpringSecurity. Ich finds amüsant, wie man immer meint, Dinge selbst besser implementieren zu können, als die vielen anderen die da schon ewig Zeit investiert haben .
    Das kommt nicht daher das ich es besser zu wissen meine, sondern es nicht besser wusste. Gibts da eine gute Anlaufstelle(Tuorial) für JEE Security?

    Gruß und danke für deine Hilfe,

    Chris
     

  4. #4
    Avatar von Oliver Gierke
    Oliver Gierke Oliver Gierke ist offline Mitglied Rubin
    Registriert seit
    Dec 2003
    Ort
    Mannheim
    Beiträge
    1.457
    Zitat Zitat von Urmel103 Beitrag anzeigen
    Ich hab beides probiert. Jar und War ohne EAR sowie EJB-Modul + WebModul in EAR.
    War kein Unterschied. Die serielVersionUIDs sind gleich. Das ClassCastProblem
    ist immernoch da. Hast du noch eine andere Idee? Bin schier am Verzweifeln.
    Hm, strange. Erzeugst du irgendwo eine anonyme Subklasse?

    Was sind Interceptoren? Muss ich mir mal anschauen.
    unchecked Exceptions ok jep mach ich.
    http://docs.jboss.org/ejb3/app-serve...terceptor.html

    Der Vollständigkeit halber auch noch den hier als "Warnung": http://blogs.codehaus.org/people/ava...r_dilemna.html. Inteceptors sind eher verkrüppeltes AOP. In EJB gibt es allerdings nichts besseres. Für einfache Anforderungen sollten sie aber ausreichen. Zumindest solltest du den Securitycode aus deiner Geschäftslogik rausbekommen. Zwar weder sonderlich hübsch noch technisch state-of-the-art, aber pragmatisch und funktionierend .


    Das kommt nicht daher das ich es besser zu wissen meine, sondern es nicht besser wusste. Gibts da eine gute Anlaufstelle(Tuorial) für JEE Security?

    Gruß und danke für deine Hilfe,

    Chris
    Das war kein Angriff, sondern eher ein lautes Denken. Ich geh halt grundsätzlich davon aus, dass ich nur das Code, was für meine Anwendung "speziell" ist. So generische Themen wie Security haben sicher schon andere Leute gelöst. Daher würde ich mich bei sowas immer als erstes danach umschauen, was es bereits gibt. Das schließt natürlich nicht aus, dass es Gründe gibt, es dann wirklich selbst zu machen - mir ist bisher nur keiner begegnet .

    Tutorial? Erster Google Hit: http://java.sun.com/javaee/5/docs/tu...doc/bnbwk.html. Das Zauberwort heißt JAAS. Macht keinen Spaß, aber du hast halt EJB gewählt .

    Gruß
    Ollie
     
    In theory, there is no difference between theory and practice. In practice, there is!

    www.olivergierke.de

  5. #5
    Urmel103 Urmel103 ist offline Rookie
    Registriert seit
    Sep 2007
    Beiträge
    7
    Zitat Zitat von Oliver Gierke Beitrag anzeigen
    Hm, strange. Erzeugst du irgendwo eine anonyme Subklasse?
    Nein. Ich hab jetzt mal eine ganz einfache Klasse gestrickt TestTO.
    Und der Bean eine " public TestTO getTestTO()" - Methode hinzugefügt.
    Und es geht nicht. Auch ClassCast Excetion.

    Die Klassendefinition zum TestTO-Objekt:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    package de.sge.taskmanager.transferObjects;
     
    import java.io.Serializable;
     
    public class TestTO implements Serializable {
     
        /**
         * 
         */
        private static final long serialVersionUID = 7611920994664841971L;
        private String name;
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
     
    }

    Und die Methode der Bean:

    Code :
    1
    2
    3
    4
    5
    6
    7
    
     
    public TestTO getTestTO(){
            TestTO test = new TestTO();
            
            test.setName("Testname");
            return test;
        }

    Ich könnt mir die Haare aus reißen.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    11:22:47,313 ERROR [[LoginServlet]] Servlet.service() for servlet LoginServlet threw exception
    java.lang.ClassCastException: de.sge.taskmanager.transferObjects.TestTO cannot be cast to de.sge.taskmanager.transferObjects.TestTO
        at $Proxy305.getTestTO(Unknown Source)
        at de.sge.taskmanager.servlets.LoginServlet.work(LoginServlet.java:77)
        at de.sge.taskmanager.servlets.LoginServlet.doPost(LoginServlet.java:54)
        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)
     

  6. #6
    Avatar von Oliver Gierke
    Oliver Gierke Oliver Gierke ist offline Mitglied Rubin
    Registriert seit
    Dec 2003
    Ort
    Mannheim
    Beiträge
    1.457
    Kannst du mal aus Spaß das Serializable entfernen?
     
    In theory, there is no difference between theory and practice. In practice, there is!

    www.olivergierke.de

  7. #7
    Urmel103 Urmel103 ist offline Rookie
    Registriert seit
    Sep 2007
    Beiträge
    7
    Das ändert leider auch nichts. Hab weiterhin das gleiche Problem.*schnief*

    Kann es sein, das ich ein grundlegendes Konfigurationsproblem mit dem JBoss hab?
     

  8. #8
    Avatar von Oliver Gierke
    Oliver Gierke Oliver Gierke ist offline Mitglied Rubin
    Registriert seit
    Dec 2003
    Ort
    Mannheim
    Beiträge
    1.457
    Ich kann mir nicht helfen, aber das schreit danach, dass du im JBoss nicht das deployt hast, was du in der IDE hast. Irgendein altes Jar? Hast dus mal komplett frisch deployt? Ein einfacher Testcase vielleicht?

    REINHAUN!
     
    In theory, there is no difference between theory and practice. In practice, there is!

    www.olivergierke.de

  9. #9
    Urmel103 Urmel103 ist offline Rookie
    Registriert seit
    Sep 2007
    Beiträge
    7
    Also hab ein ganz neues Projekt angelegt (EJB-Modul + WebModul --> EAR).
    Stateful Session Bean mit der Methode public TestTO getTestTO() + Local Interface.
    Im WebModul ein Servlet das nichts weiter tut als die Bean per DI zu holen und dann deren Methode ausführt.

    Methode liefert ein TestTO zurück und dieses soll einer lokalen Var im Servlet zu gewiesen werden --> Ergebniss: ClassCastException

    Hast du einen JBoss 5.0.0 GA laufen?
    Dann geb ich dir mal das kleine Testproject. Solangsam glaub ich nämlich
    selbst nicht mehr was ich hier sehe. Ich hau mal den JBoss weg und setzt den neu.
     

  10. #10
    Urmel103 Urmel103 ist offline Rookie
    Registriert seit
    Sep 2007
    Beiträge
    7
    Also hier ist der Kruscht
    Angehängte Dateien Angehängte Dateien
     

  11. #11
    Avatar von Oliver Gierke
    Oliver Gierke Oliver Gierke ist offline Mitglied Rubin
    Registriert seit
    Dec 2003
    Ort
    Mannheim
    Beiträge
    1.457
    *gg* Du willst mich wohl verarschen, was? Spass... Wenn du die Klasse einmal im EJB Projekt hast und einmal im Webprojekt, ist es logisch, dass du eine ClassCastException bekommst. Die Klasse TestTO aus dem TestEJB projekt wird von einem anderen Classloader geladen, als die TestTO aus dem TestWeb Projekt. Bitte NIEMALS Klassen mit gleichem Namen ins gleiche Package eines anderen Projektes (respektive Jars) legen.

    Gruß
    Ollie

    Edit: lösch mal das interface und das TO im Webprojekt und für das EJB Projekt dem Webprojekt als Dependency hinzu. Dein Servlet sollte dann weiterhin kompilieren und das Servlet auch so tun wie erwartet.
     
    In theory, there is no difference between theory and practice. In practice, there is!

    www.olivergierke.de

  12. #12
    Urmel103 Urmel103 ist offline Rookie
    Registriert seit
    Sep 2007
    Beiträge
    7
    ich schau mal

    Edit: Ich brech zusammen. Des geht. Die Schei*** geht. Ich mach hier das ganze Wochenende rum und das geht.

    Schande über mein Haupt.

    Und wie würde sich das jetzt verhalten wenn EJB und Web auf unterschiedlichen Rechnern wären?
    Dann müsste ich es doch so machen wie ich es , bis zu der Erleuchtung durch dich, bisher gemacht hab.Oder?
    Die gleiche Schose hatte ich schon einmal übersehen. Bei nem Web Service. Ich hatte zweimal
    die gleiche jar eingebunden. Dumm dumm. Und da heißt es aus Fehlern lernt man.

    Auf jedenfall dank ick dir tausend mal.
    Geändert von Urmel103 (13.02.09 um 18:24 Uhr)
     

  13. #13
    Avatar von Oliver Gierke
    Oliver Gierke Oliver Gierke ist offline Mitglied Rubin
    Registriert seit
    Dec 2003
    Ort
    Mannheim
    Beiträge
    1.457
    Zitat Zitat von Urmel103 Beitrag anzeigen
    Und wie würde sich das jetzt verhalten wenn EJB und Web auf unterschiedlichen Rechnern wären?
    Dann müsste ich es doch so machen wie ich es , bis zu der Erleuchtung durch dich, bisher gemacht hab.Oder?
    Nein, ich versteh nicht, wie man darauf kommt, die Klassen einem anderen Projekt bekannt zu machen in dem man sie dahin kopiert. Wenn du die Projekte "richtig" trennen willst, müssen die zwei Klassen in ein extra Projekt, das dann sowohl das EJB Projekt als auch das Webprojekt referenzieren.

    Gruß
    Ollie
     
    In theory, there is no difference between theory and practice. In practice, there is!

    www.olivergierke.de

Ähnliche Themen

  1. Stateful-Bean verliert seine Werte warum?
    Von ceene im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 13
    Letzter Beitrag: 10.08.10, 12:56
  2. Wie starte ich Prozesse aus einer Session Bean?
    Von sepan im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 1
    Letzter Beitrag: 08.03.10, 14:28
  3. Bean-Variablen als Parameter einer Methode einer anderen Bean
    Von mcdroemmel im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 25.06.09, 17:53
  4. EJB Stateful session beans synchronisieren
    Von sepan im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 3
    Letzter Beitrag: 21.01.08, 17:46
  5. EJB3 - Instanz von Remote Stateful Bean an Client zurückgeben?
    Von sepan im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 5
    Letzter Beitrag: 15.07.07, 14:33

Stichworte