【问题标题】:Spring Data REST, cannot save, can selectSpring Data REST,不能保存,可以选择
【发布时间】:2016-02-03 21:09:18
【问题描述】:

我很困惑为什么我的 Spring Data REST 代码可以正常工作,但现在不行了。可能是配置问题,但我无法指出是什么。当我使用 AJAX 发布到端点时,我收到 500 错误 - java.lang.IllegalArgumentException: argument type mismatch。当我从独立的 java 中尝试 repository.save() 时,我没有得到任何回应。另一方面,当我对我的 API 执行 get 或调用 repository.find() 时,我可以看到 Hibernate 显示选择正在发生。所以我知道我的数据库已连接。此外,我正在使用 Flyway,这些脚本可以毫无问题地插入。

我正在为 Data-REST、Data-JPA 和 thymeleaf 使用 Spring-Boot-Starter,所有版本均为 1.2.1.RELEASE。我认识到这可能是一个版本问题,但我将其保留在这里以最终与 Spring-Security-Kerberos 集成,我知道它适用于该版本的 Spring-Boot。至少,我还没有让它与更高版本的 Spring-Boot 一起工作。

我注意到的一些事情可能相关也可能不相关:

  • @Transactional 在上面我的 @RestRepositoryResource 没有区别
  • 调用repository.save()时,返回的实体ID保持为0(我在我的实体上自动生成)
  • 我的所有实体都存在此问题,包括没有任何关系的实体
  • 我从我的一个实体中删除了 unique=true 并不重要

我的存储库接口之一

@RepositoryRestResource(collectionResourceRel = "shifts", path = "shifts")
public interface ShiftRepository extends PagingAndSortingRepository<Shift, Long> {
    List<Shift> findBySiteId(@Param("siteId") String siteId);
    Shift findByShiftCode(@Param("shiftCode") String shiftCode);
}

我的存储库配置组件

@Component
public class RepositoryConfigDev {
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;

    @Bean
    EventHandler eventHandler() {
        return new EventHandler();
    }

    @Bean
    DataSource dataSource() {
        DriverManagerDataSource ds = new DriverManagerDataSource();
        ds.setDriverClassName(driverClassName);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        return ds;
    }

    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
        adapter.setDatabase(Database.SQL_SERVER);
        adapter.setDatabasePlatform("org.hibernate.dialect.SQLServer2012Dialect");
        adapter.setShowSql(true);
        adapter.setGenerateDdl(false);
        return adapter;
    }


    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean emfb = new LocalContainerEntityManagerFactoryBean();
        emfb.setJpaVendorAdapter(jpaVendorAdapter());
        emfb.setDataSource(dataSource());
        emfb.setPackagesToScan("package.model");
        emfb.afterPropertiesSet();
        return emfb;
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory().getObject());
        txManager.setRollbackOnCommitFailure(true);
        return txManager;
    }

}

【问题讨论】:

    标签: spring hibernate jpa spring-data spring-data-rest


    【解决方案1】:

    所以在从头开始重建之后,我发现我做错了什么。问题出在@RepositoryEventHandler。因为我最初将这个类声明为

    @RepositoryEventHandler(value={Class1.class, Class2.class})
    public class RepoEvents {
        ....
    }
    

    应该是什么时候

    @RepositoryEventHandler
    public class RepoEvents {
        @HandleBeforeCreate(Class1.class)
        public void beforeCreate1(Class1 c) { ... }
    
        @HandleBeforeCreate(Class2.class)
        public void beforeCreate2(Class2 c) { ... }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-30
      • 2015-01-20
      • 2020-02-28
      • 2013-08-24
      • 2014-07-08
      • 1970-01-01
      • 2014-05-05
      • 2018-03-10
      • 1970-01-01
      相关资源
      最近更新 更多