Spring JPA自定义存储库不同的包

时间:2017-11-19 14:30:47

标签: spring spring-boot spring-data repository spring-data-jpa

我正在开发一个spring boot应用程序,我在这里遇到了一个问题。我想为我的RepositoryImpl,RepositoryCustom和Repository类提供单独的包,但是当我分离包时我得到了这个错误:

  

引起:   org.springframework.data.mapping.PropertyReferenceException:没有   找到类型Demo的属性customMethod!

只有当我将RepositoryImpl,RepositoryCustom和Repository类放入同一个包中时,它才有效。我已经尝试了@EnableJpaRepositories("com.example.demo.persist")但仍然没有工作。

有没有办法实现这个目标?

这是我的代码:

Project packages

DemoApplication.java

@SpringBootApplication
@EnableJpaRepositories("com.example.demo.persist")
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

DemoController.java

@RestController
public class DemoController {

    @Autowired
    DemoService demoService;

    @RequestMapping("/test")
    public String getUnidades() {
        demoService.customMethod();
        return "test";
    }

}

DemoRepositoryCustom.java

public interface DemoRepositoryCustom {

    void customMethod();

}

DemoRepositoryImpl.java

public class DemoRepositoryImpl implements DemoRepositoryCustom {

    @Override
    public void customMethod() {
        // do something
    }

}

DemoRepositoryCustom.java

public interface DemoRepository extends JpaRepository<Demo, Long>, DemoRepositoryCustom {

}

Demo.java

@Entity
public class Demo {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", columnDefinition = "bigint")
    private int id;

    @NotEmpty
    @Column(name = "name", columnDefinition = "VARCHAR(60)", length = 60, unique = false, nullable = false)
    private String name;

    // ...

DemoService.java

@Service
@Transactional
public class DemoService {

    @Autowired
    DemoRepository demoRepository;

    public void customMethod() {
        demoRepository.customMethod();
    }

}

application.properties

spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect

spring.datasource.url=jdbc:mysql://localhost:3306/demo?createDatabaseIfNotExist=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

2 个答案:

答案 0 :(得分:1)

自定义实现的自动检测仅适用于声明存储库的程序包之下的程序包。

但是,您可以使您的实现成为名称与所需类名匹配的bean。 在你的情况下,这将是demoRepositoryImpl

See the documentation for details

答案 1 :(得分:1)

实际上您的包层次结构的顺序不正确。

像这样:

com.example.demo.repository
com.example.demo.repository.custom
com.example.demo.repository.custom.impl

它会起作用。