我正在使用 Spring Data REST 将我的 JPA 存储库公开为 Web 服务。
我正在使用 RestTemplate 测试每个 Web 服务。我希望这些测试成为集成测试...这意味着我在应用程序运行时执行每个测试。我不想嘲笑任何事情。
现在我想知道的是如何配置 Spring Data REST 在发送 HTTP POST 时将新创建的实体作为正文的一部分返回。
我尝试在配置类 RepositoryRestMvcConfiguration 中设置适当的标志,但它似乎不起作用。
这是我的配置类:
@Configuration
public class RepositoryRestMvcConfiguration extends org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration {
@Override
public RepositoryRestConfiguration config() {
RepositoryRestConfiguration config = super.config();
config.setBasePath("/sdr-api");
config.setReturnBodyOnCreate(Boolean.TRUE);
config.setReturnBodyOnUpdate(Boolean.TRUE);
config.exposeIdsFor(Project.class);
config.setDefaultMediaType(MediaType.APPLICATION_JSON);
return config;
}
}
这是我想要执行的测试示例:
@Test
@SqlGroup({ @Sql(scripts = "/clear-data.sql", config = @SqlConfig(transactionMode = TransactionMode.ISOLATED)) })
public void create() {
final String PROJECT_NAME = "MY_PROJECT";
Project project = new Project();
project.setName(PROJECT_NAME);
ResponseEntity<Project> response = restTemplate().postForEntity(getBaseUrl() + "projects", project, Project.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.CREATED));
Project projectCreated = response.getBody();
assertThat(projectCreated.getId(), notNullValue());
assertThat(projectCreated.getCreatedBy(), notNullValue());
assertThat(projectCreated.getCreatedDate(), notNullValue());
assertThat(projectCreated.getLastModifiedBy(), notNullValue());
assertThat(projectCreated.getLastModifiedDate(), notNullValue());
assertThat(projectCreated.getName(), equalTo(PROJECT_NAME));
}
此测试在以下语句上失败,因为 ID 以及所有其他属性均为空...
assertThat(projectCreated.getId(), notNullValue());
即使当我尝试使用curl调用WS时,它也没有给出我期望的结果......
curl -i -X POST -H "Content-Type:application/json" -d '{ "name" : "MY_PROJECT" }' http://localhost:8081/myproject/sdr-api/projects
它应该返回新创建的实体,并且应该返回结果为 application/json 而不是我的配置类中指定的 application/hal+json ...
HTTP/1.1 201 Created
Server: Apache-Coyote/1.1
Access-Control-Allow-Methods: GET, POST, HEAD, PUT, DELETE, OPTIONS
Access-Control-Max-Age: 3600
Access-Control-Allow-Headers: Accept, Origin, X-Requested-With, Content-Type, Last-Modified, Authorization
Access-Control-Allow-Credentials: true
ETag: "0"
Last-Modified: Tue, 10 Nov 2015 19:59:12 GMT
Location: http://localhost:8081/myproject/sdr-api/projects/4
Content-Type: application/hal+json
Transfer-Encoding: chunked
Date: Tue, 10 Nov 2015 19:59:12 GMT
{
"_links" : {
"self" : {
"href" : "http://localhost:8081/myproject/sdr-api/projects/4"
},
"project" : {
"href" : "http://localhost:8081/myproject/sdr-api/projects/4{?projection}",
"templated" : true
}
}
}
知道可能是什么问题吗?
在过去的几个小时里我尝试了很多事情......在 Spring 2.4.0.RELEASE 中,我尝试按照
的建议使用
RepositoryRestConfigurerAdapter
@Configuration
@Import(RepositoryRestMvcConfiguration.class)
public class SpringDataRestConfiguration extends RepositoryRestConfigurerAdapter {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.setBasePath("/sdr-api");
config.setReturnBodyOnCreate(Boolean.TRUE);
config.setReturnBodyOnUpdate(Boolean.TRUE);
config.exposeIdsFor(Project.class);
config.useHalAsDefaultJsonMediaType(false);
config.setDefaultMediaType(MediaType.APPLICATION_JSON);
}
}
但我仍然得到相同的结果...代码似乎已执行,因为我的 SDR API 在 /sdr-api 下可用。
所以我决定将Spring Data Rest的版本降级到2.3.2.RELEASE。我已经这样修改了我的配置类:
@Configuration
public class MySDRConfiguration extends RepositoryRestMvcConfiguration {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.setBasePath("/sdr-api");
config.setReturnBodyOnCreate(Boolean.TRUE);
config.setReturnBodyOnUpdate(Boolean.TRUE);
config.exposeIdsFor(Project.class);
config.useHalAsDefaultJsonMediaType(false);
config.setDefaultMediaType(MediaType.APPLICATION_JSON);
}
}
这一次,它起作用了!我得到的结果正是我所期望的:
HTTP/1.1 201 Created
Server: Apache-Coyote/1.1
Access-Control-Allow-Methods: GET, POST, HEAD, PUT, DELETE, OPTIONS
Access-Control-Max-Age: 3600
Access-Control-Allow-Headers: Accept, Origin, X-Requested-With, Content-Type, Last-Modified, Authorization
Access-Control-Allow-Credentials: true
ETag: "0"
Last-Modified: Thu, 12 Nov 2015 20:55:32 GMT
Location: http://localhost:8081/myproject/sdr-api/projects/3
Content-Type: application/json
Transfer-Encoding: chunked
Date: Thu, 12 Nov 2015 20:55:32 GMT
{
"id" : 3,
"createdBy" : "anonymousUser",
"createdDate" : "2015-11-12T20:55:32.368Z",
"lastModifiedBy" : "anonymousUser",
"lastModifiedDate" : "2015-11-12T20:55:32.368Z",
"name" : "TEST",
"links" : [ ],
"content" : [ ],
"links" : [ {
"rel" : "self",
"href" : "http://localhost:8081/myproject/sdr-api/projects/3"
}, {
"rel" : "testPlans",
"href" : "http://localhost:8081/myproject/sdr-api/projects/3/testPlans"
} ]
}
我是否缺少最新版本的 Spring Data REST 的某些内容?
带弹簧:
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
@SpringBootApplication
public class QuizApplication implements ViewProvider {
public static void main(String[] args) {
SpringApplication.run(QuizApplication.class, args);
}
@Bean
public RepositoryRestConfigurer repositoryRestConfigurer(EntityManager entityManager) {
return RepositoryRestConfigurer.withConfig(config -> config.exposeIdsFor(Question.class));
}
}