2016-06-22 3 views
0

Je passe par un tutoriel de printemps. http://websystique.com/spring-security/spring-security-4-remember-me-example-with-hibernate/comment le contrôle atteint la classe d'entité

Je ne suis pas en mesure de comprendre le flux de contrôle de UserDaoImpl.findBySSO à UserProfile ... Pourriez-vous s'il vous plaît me aider

Ci-dessous est le débogage stacktrace

UserProfile.<init>() line: 18 
NativeConstructorAccessorImpl.newInstance0(Constructor<?>, Object[]) line: not available [native method]  
NativeConstructorAccessorImpl.newInstance(Object[]) line: 62  
DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 45  
Constructor<T>.newInstance(Object...) line: 423 
PojoInstantiator.instantiate() line: 124  
PojoInstantiator.instantiate(Serializable) line: 136  
PojoEntityTuplizer(AbstractEntityTuplizer).instantiate(Serializable, SessionImplementor) line: 737 
SingleTableEntityPersister(AbstractEntityPersister).instantiate(Serializable, SessionImplementor) line: 4761  
SessionImpl.instantiate(EntityPersister, Serializable) line: 1391 
SessionImpl.instantiate(String, Serializable) line: 1379  
CriteriaLoader(Loader).instanceNotYetLoaded(ResultSet, int, Loadable, String, EntityKey, LockMode, EntityKey, Object, List, SessionImplementor) line: 1618 
CriteriaLoader(Loader).getRow(ResultSet, Loadable[], EntityKey[], Object, EntityKey, LockMode[], List, SessionImplementor) line: 1514 
CriteriaLoader(Loader).getRowFromResultSet(ResultSet, SessionImplementor, QueryParameters, LockMode[], EntityKey, List, EntityKey[], boolean, ResultTransformer) line: 725 
CriteriaLoader(Loader).processResultSet(ResultSet, QueryParameters, SessionImplementor, boolean, ResultTransformer, int, List<AfterLoadAction>) line: 952 
CriteriaLoader(Loader).doQuery(SessionImplementor, QueryParameters, boolean, ResultTransformer) line: 920 
CriteriaLoader(Loader).doQueryAndInitializeNonLazyCollections(SessionImplementor, QueryParameters, boolean, ResultTransformer) line: 354  
CriteriaLoader(Loader).doList(SessionImplementor, QueryParameters, ResultTransformer) line: 2553  
CriteriaLoader(Loader).doList(SessionImplementor, QueryParameters) line: 2539 
CriteriaLoader(Loader).listIgnoreQueryCache(SessionImplementor, QueryParameters) line: 2369 
CriteriaLoader(Loader).list(SessionImplementor, QueryParameters, Set<Serializable>, Type[]) line: 2364 
CriteriaLoader.list(SessionImplementor) line: 126 
SessionImpl.list(Criteria) line: 1682 
CriteriaImpl.list() line: 380 
CriteriaImpl.uniqueResult() line: 402 
UserDaoImpl.findBySSO(String) line: 19 
UserServiceImpl.findBySso(String) line: 22 

code (flux provenant initié à partir de cette portion de code)

package com.websystique.springsecurity.service; 

import java.util.ArrayList; 
import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.security.core.GrantedAuthority; 
import org.springframework.security.core.authority.SimpleGrantedAuthority; 
import org.springframework.security.core.userdetails.UserDetails; 
import org.springframework.security.core.userdetails.UserDetailsService; 
import org.springframework.security.core.userdetails.UsernameNotFoundException; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import com.websystique.springsecurity.model.User; 
import com.websystique.springsecurity.model.UserProfile; 

@Service("customUserDetailsService") 
public class CustomUserDetailsService implements UserDetailsService{ 

    @Autowired 
    private UserService userService; 

    @Transactional(readOnly=true) 
    public UserDetails loadUserByUsername(String ssoId) 
      throws UsernameNotFoundException { 
     User user = userService.findBySso(ssoId); 
     System.out.println("User : "+user); 
     if(user==null){ 
      System.out.println("User not found"); 
      throw new UsernameNotFoundException("Username not found"); 
     } 
      return new org.springframework.security.core.userdetails.User(user.getSsoId(), user.getPassword(), 
       user.getState().equals("Active"), true, true, true, getGrantedAuthorities(user)); 
    } 


    private List<GrantedAuthority> getGrantedAuthorities(User user){ 
     List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 

     for(UserProfile userProfile : user.getUserProfiles()){ 
      System.out.println("UserProfile : "+userProfile); 
      authorities.add(new SimpleGrantedAuthority("ROLE_"+userProfile.getType())); 
     } 
     System.out.print("authorities :"+authorities); 
     return authorities; 
    } 

} 

classe d'entité (témoin atteint de cette portion de code)

package com.websystique.springsecurity.model; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name="USER_PROFILE") 
public class UserProfile { 

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 

    @Column(name="TYPE", length=15, unique=true, nullable=false) 
    private String type = UserProfileType.USER.getUserProfileType(); 

    @Column(name="TESTTYPE", length=15, unique=true, nullable=false) 
    private String testtype = UserProfileType.DBA.getUserProfileType(); 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 


    public String getTesttype() { 
     return testtype; 
    } 

    public void setTesttype(String testtype) { 
     this.testtype = testtype; 
    } 



    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + id; 
     result = prime * result + ((type == null) ? 0 : type.hashCode()); 
     return result; 
    } 
    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (!(obj instanceof UserProfile)) 
      return false; 
     UserProfile other = (UserProfile) obj; 
     if (id != other.id) 
      return false; 
     if (type == null) { 
      if (other.type != null) 
       return false; 
     } else if (!type.equals(other.type)) 
      return false; 
     return true; 
    } 
    @Override 
    public String toString() { 
     System.out.println("UserProfile [id=" + id + ", type=" + type + "]"); 
     return "UserProfile [id=" + id + ", type=" + type + "]"; 
    } 


} 

projet complet est disponible en GitHub https://github.com/jaisonsteephen/EnumDoubtClarification/blob/master/src/main/java/com/websystique/springsecurity/service/CustomUserDetailsService.java

+0

Veuillez ajouter le code pour une résolution rapide de votre requête – Mudassar

+0

Bonjour Mudassar, Merci pour votre commentaire. J'ai ajouté l'extrait de code et terminer le projet via GitHub – jaison

Répondre

0

La solution à votre problème est dans AbstractDao classe à cette ligne

public AbstractDao(){ 
     this.persistentClass =(Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1]; 
    } 

Debug cette ligne et laissez-moi savoir si vous figure encore cant sur

+0

Merci pour la réponse. J'ai mis un point d'arrêt dans la ligne spécifiée ... mais le contrôle ne frappe pas là – jaison

0

Je pense, j'ai eu la réponse à ma question. Je partage ma réponse.

Dans stacktrace il y a une ligne CriteriaLoader (Loader) .getRow. Si nous cliquons sur cette ligne, nous pouvons voir que chaque entrée persistante essaie d'être initialisée.

 else { 
      object = instanceNotYetLoaded(
        rs, 
        i, 
        persisters[i], 
        descriptors[i].getRowIdAlias(), 
        key, 
        lockModes[i], 
        optionalObjectKey, 
        optionalObject, 
        hydratedObjects, 
        session 
       ); 
     } 
  • Ainsi, dans la première boucle de i, entité UserProfile initialisées. Dans la deuxième boucle Entité utilisateur initialisée.
  • Puisqu'il y a un code associé à cette classe, il est également initialisé. Mais comme il n'y a pas de Enum dans la classe User, nous ne voyons pas le contrôle venir ici.

Si nous mettons un ENUM similaire (comme ci-dessous l'extrait de code) là aussi, nous pouvons voir le contrôle vient de là.

@Column(name="FIRST_NAME", nullable=false) 
private String firstName = UserType.USER.getUserType(); 
+0

Contente d'avoir été de l'aide :) – Mudassar