2014-12-07 68 views
0

我知道这里已经有很多关于这个的问题了,但其中大多数是指XML配置,我正在使用注释。我的IDE是IntelliJ,我使用Gradle作为我的编译系统。只读模式下不允许弹出写操作

所以我有一个非常简单的Web服务,我想启用登录和注册功能。吾道看起来是这样的:

public class UserDAO implements IUserDAO { 

    @Autowired 
    private HibernateTemplate hibernateTemplate; 

    @Override 
    public void addUser(User user) { 
     hibernateTemplate.save(user); 
    } 

    @Override 
    public User findByUsername(String username) { 
     return hibernateTemplate.execute(session -> (User) 
       session.createCriteria(User.class) 
         .add(Restrictions.eq("username", username)) 
         .uniqueResult()); 
    } 
} 

而且我的配置是这样的:

@Configuration 
@EnableTransactionManagement 
public class AppConfig { 

    @Bean 
    public IUserDAO userDAO() { 
     return new UserDAO(); 
    } 

    @Bean 
    public HibernateTemplate hibernateTemplate() { 
     return new HibernateTemplate(sessionFactory()); 
    } 

    @Bean 
    public SessionFactory sessionFactory() { 
     return new LocalSessionFactoryBuilder(getDataSource()) 
       .addAnnotatedClasses(User.class) 
       .buildSessionFactory(); 
    } 

    @Bean 
    public DataSource getDataSource() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
     dataSource.setUrl("jdbc:mysql://example.com:3306/myDatabase"); 
     dataSource.setUsername("myUser"); 
     dataSource.setPassword("myUser123"); 

     return dataSource; 
    } 

    @Bean 
    public HibernateTransactionManager hibTransMan() { 
     return new HibernateTransactionManager(sessionFactory()); 
    } 
} 

我用这个在我RestController得到DAO:

@Autowired 
private IUserDAO userDAO; 

执行findByUsername工程确定并返回与给定用户名匹配的User。然而,addUser方法不工作,并给了我这个错误:

Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition. 

我环顾四周,发现我要补充@Transactional(readOnly = false)我的功能,所以我做了(我加了上面我addUser功能,如果这甚至把它...)正确的地方,但后来我得到这个错误:

No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2: hibTransMan,transactionManager 

谁能帮助我这种情况呢?另外,对于任何IntelliJ用户,我的UserDAO中的@Autowired注释会被标记为带有Autowired members must be defined in the valid spring bean(@Component/@Service,etc.)的警告。任何人都知道这是为什么发生?

P.S.如果有人通过Lambda表达式我findByUsername方法一震,我使用Java 8

回答

0

我找到了解决办法,我在AppConfig类增加了@Transactional(readOnly = false)注释我addUser方法,并@PrimaryhibTransMan方法。但是,关于@Autowired的警告仍然存在,有人知道为什么吗?

+0

您是否在项目结构中配置了Spring构面?如果你没有配置它,IntelliJ不会知道UserDao实际上被用作Spring Bean(它在你的AppConfig类中定义),因此它会显示警告。 – 2014-12-07 22:39:41

+0

我确实,是的。起初,它没有配置,我得到了更多的这些错误,然后我设置了它们,其中大部分都没有了,但是这个仍然存在。此外,它旁边有一个图标“导航到自动布线的依赖关系”。如果我点击它,它会将我带到我的AppConfig文件中,在那里定义我的'hibernateTemplate'方法,就像它应该那样。 – Squeazer 2014-12-07 22:43:04