【问题标题】:Spring Write operations are not allowed in read-only mode只读模式下不允许 Spring Write 操作
【发布时间】:2014-12-07 20:57:26
【问题描述】:

我知道已经有很多关于 SO 的问题了,但其中大多数是指 XML 配置,我正在使用注释。我的 IDE 是 IntelliJ,我使用 Gradle 作为构建系统。

所以我有一个非常简单的网络服务,我想启用登录和注册功能。我的 DAO 如下所示:

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.) 的警告。有人知道为什么会这样吗?

附:如果有人对我的findByUsername 方法中的 Lambda 表达式感到震惊,我使用的是 Java 8。

【问题讨论】:

    标签: java spring hibernate intellij-idea


    【解决方案1】:

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

    【讨论】:

    • 您是否在项目结构中配置了 Spring facet?如果您没有配置它,IntelliJ 将不知道 UserDao 实际用作 Spring Bean(在您的 AppConfig 类中定义),因此它会显示警告。
    • 我愿意,是的。起初,它没有配置,我得到了更多这些错误,然后我设置了它,其中大部分都消失了,但这个仍然存在。此外,它旁边还有一个图标“导航到自动装配的依赖项”。如果我点击它,它会将我带到我的 AppConfig 文件,其中定义了我的 hibernateTemplate 方法。
    猜你喜欢
    • 2015-03-14
    • 2011-12-01
    • 2014-04-26
    • 1970-01-01
    • 2011-10-12
    • 2016-12-12
    • 2011-07-21
    • 2014-10-03
    • 2018-01-20
    相关资源
    最近更新 更多