我第一次尝试 Spring Data Rest,但我似乎无法在
localhost:8080/books
找到我的存储库端点 有谁看到我配置错误了吗?
应用类
@SpringBootApplication
@ComponentScan(basePackageClasses = {Book.class})
public class SpringDataMicroServiceApplication {
public static void main(String[] args) {
SpringApplication.run(SpringDataMicroServiceApplication.class, args);
}
}
图书实体
@lombok.Getter
@lombok.Setter
@lombok.RequiredArgsConstructor
@lombok.EqualsAndHashCode(of = "isbn")
@lombok.ToString(exclude="id")
@Entity
public class Book implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private long id;
private String isbn;
private String title;
private String author;
private String description;
}
书籍存储库
public interface BookRepository extends CrudRepository<Book, Long> {
}
Gradle 构建文件
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'io.spring.gradle:dependency-management-plugin:0.5.4.RELEASE'
}
}
apply plugin: 'io.spring.dependency-management'
apply plugin: 'java'
apply plugin: 'idea'
dependencyManagement {
imports {
mavenBom 'io.spring.platform:platform-bom:2.0.5.RELEASE'
}
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-aop')
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-data-rest')
compile('org.springframework.data:spring-data-rest-hal-browser')
compile('org.projectlombok:lombok:1.16.6')
compile('org.springframework.retry:spring-retry')
compile('org.springframework.boot:spring-boot-starter-validation')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-starter-ws')
compile('org.springframework.boot:spring-boot-actuator')
runtime('com.h2database:h2')
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.springframework.restdocs:spring-restdocs-mockmvc')
}
在 Spring Boot 中,默认情况下您不需要执行
@ComponentScan
、 @EntityScan
和 @EnableJpaRepositories
。将 @RepositoryRestResource
添加到您的存储库。从入门类中删除除 @SpringBootApplication
之外的所有注释。 Spring boot默认会扫描所有包。然后您将能够找到端点localhost:8080/books
。它对您不起作用,因为您专门只扫描实体类。未扫描存储库。当您删除这些注释时,将扫描所有包,我们将打包存储库 bean,并且端点将可用。
如果您使用多个包,请确保将应用程序启动器保留在基础包中。示例:
src
└── main
└── java
└──/com.myapp.springstuff
├─── Application.java
├─── package1
└─── package2
好的解决了这个问题,我所需要做的就是在我的主应用程序上添加一些用于扫描的注释。我必须告诉它找到实体和存储库,因为它们位于不同的包中。
@SpringBootApplication
@ComponentScan(basePackageClasses = {BookRepository.class})
@EntityScan(basePackageClasses = {Book.class})
@EnableJpaRepositories(basePackageClasses = {BookRepository.class})
public class SpringDataMicroServiceApplication {
public static void main(String[] args) {
SpringApplication.run(SpringDataMicroServiceApplication.class, args);
}
}
您缺少一个资源控制器 (
@RestController
),它将 GET
(/books
) 的 @RequestMapping("/books")
请求路由到 Java 方法,例如从数据库检索 Book
实体。
请参阅创建资源控制器了解更多详细信息。