2016-10-30 5 views
0

を得ることができませんでした:休止状態、のOAuth2は、私は自分のcustomDetailsS​​erviceを作ってみました、私は、HTTPを使用してトークンサーバを呼び出すようにしようとしたときに、トランザクション同期

POST http://localhost:8080/SpringSecurityOAuth2Example/oauth/token?grant_type=password&username=bill&password=abc123

私は、結果として例外が発生しました:

<UnauthorizedException xmlns=""> 
    <error>unauthorized</error> 
    <error_description>Could not obtain transaction-synchronized Session for current thread</error_description> 
</UnauthorizedException> 

さらに、私はこれをデバッグしたときに、メソッドuserDaoImpl.findByLogin(login)に問題があると判断しました。しかし、私がrestControllerからテストを呼び出すと、それは機能し、アノテーションは類似していました。

@EnableTransactiomManagementは、休止状態の設定で追加され、必要なクラスには@Transactionというアノテーションが付けられます。

MyUserDetailsS​​ervice

package com.maxim.spring.restcontroller; 

import java.util.ArrayList; 
import java.util.List; 
import org.springframework.transaction.annotation.Transactional; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
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 com.maxim.spring.dao.UserDao; 
import com.maxim.spring.model.User; 

@Transactional 
@Service("MyUserDetailsService") 
public class MyUserDetailsService implements UserDetailsService { 

    @Autowired 
    @Qualifier("userDaoImpl") 
    private UserDao userDaoImpl; 



    @Transactional(readOnly=true) 
    @Override 
    public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException { 


     User user = userDaoImpl.findByLogin(login); 


     if(user == null) { 
      System.out.println("User was not found "); 
      throw new UsernameNotFoundException(login); 
     } else { 
      System.out.println("Tu powinienem byc i jestem"); 
      new org.springframework.security.core.userdetails.User(user.getLogin(), user.getPass(), getUserRole(user)); 
     } 

     return null; 
    } 

    public List<GrantedAuthority> getUserRole(User user) { 
     List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 

     authorities.add(new SimpleGrantedAuthority("ROLE_"+user.getRole())); 

     return authorities; 
    } 

UserDaoImpl:

package com.maxim.spring.dao; 

import java.util.List; 


import org.springframework.transaction.annotation.Transactional; 

import org.hibernate.Query; 
import org.hibernate.criterion.Restrictions; 
import org.springframework.stereotype.Repository; 

import com.maxim.spring.model.User; 


@Transactional 
@Repository("userDaoImpl") 
public class UserDaoImpl extends AbstractDao implements UserDao{ 

    public User findById(Integer id) { 



    @Override 
    public User findByLogin(String login) { 
     System.out.println("w srodku1"); 
     Query qr = (Query) getSession().getCurrentSession().createQuery("from User u where u.login=:login").setParameter("login", login); 
     System.out.println("w srodku2"); 
     User u = (User) qr.list().get(0); 
     System.out.println("w srodku3"); 
     return u; 
    } 





} 

hibernate設定:

@EnableTransactionManagement 
@Configuration 
@ComponentScan({ "com.maxim.spring.configuration" }) 
@PropertySource(value = { "classpath:application.properties" }) 
public class HibernateConfiguration { 

    @Autowired 
    private Environment environment; 

    @Bean 
    public LocalSessionFactoryBean sessionFactory() { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(dataSource()); 
     sessionFactory.setPackagesToScan(new String[] { "com.maxim.spring.model", "com.maxim.spring.services" }); 
     sessionFactory.setHibernateProperties(hibernateProperties()); 
     return sessionFactory; 
    } 

    @Bean 
    public DataSource dataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName")); 
     dataSource.setUrl(environment.getRequiredProperty("jdbc.url")); 
     dataSource.setUsername(environment.getRequiredProperty("jdbc.username")); 
     dataSource.setPassword(environment.getRequiredProperty("jdbc.password")); 
     return dataSource; 
    } 

    private Properties hibernateProperties() { 
     Properties properties = new Properties(); 
     properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 
     properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 
     properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); 
     return properties;   
    } 

    @Bean 
    @Autowired 
    public HibernateTransactionManager transactionManager(SessionFactory s) { 
     HibernateTransactionManager txManager = new HibernateTransactionManager(); 
     txManager.setSessionFactory(s); 
     return txManager; 
    } 
} 

どのようにそれを動作させるには?私の間違いは何ですか?

答えて

1

getSession()を使用しています。getCurrentSession()....... getSession()。openSession() .....これは動作します。

詳細enter this discussion

0

@TransactionalメソッドloadUserByUsername()の呼び出し@TransactionalメソッドfindByLogin()は競合しているため、2つのトランザクションを開くことはできません。あなたのための

アイデア:

クラス上のすべての@Transactionalを削除し、あなたがトランザクションになりたいのメソッドに@Transactionalを追加します。メソッドloadUserByUsername()はトランザクションである必要がありますが、メソッドfindByLogin()はトランザクショナルメソッドから呼び出されるため、トランザクションにすることはできません。

+0

残念ながら、それは手がかりではありません。メソッドloadUserByUsername()から@Transactionalを削除し、代わりにメソッドfindByLogin()から削除しましたが、依然として同じフォールトが存在します。 – sebaaastian

+0

上記のクラスの上で '@トランザクション'を削除する必要があります。 '@トランザクション'アノテーションはメソッドの上にある必要があります。 あなたのためのアイデア: – paun90

+0

あまりにも機能しません..おそらくこれはoauth賢明なケースです。 – sebaaastian

関連する問題