【发布时间】:2016-01-12 15:24:26
【问题描述】:
由于某种原因,如果我通过浏览器或通过我的 MockMVC 测试类访问我的 Spring 控制器,它会返回不同的响应。 有人可以帮我找出原因吗?
首先是控制器方法:
@RequestMapping(value = APPLICATIONS_ROOT, method = GET)
public HttpEntity<ApplicationsListResource> listApplications(@PageableDefault(page = DEFAULT_START,
size = DEFAULT_HITS_PER_PAGE) Pageable pageable) {
Page<Application> applications = applicationRepository.findAll(pageable);
ApplicationsListResource applicationListResource = new ApplicationsListResource(applications, pageable);
return new ResponseEntity<ApplicationsListResource>(applicationListResource, HttpStatus.OK);
}
显然那里有一些未知的类。 ApplicationListResource 扩展 ResourceSupport 并包含一个名为 applications 的 ApplicationResource 列表。这个ApplicationResource 也扩展了ResourceSupport。
当我通过浏览器访问代码时,我会得到以下内容:
{
"_links": {
"self": {
"href": "http://localhost:10000/applications{?page,size,sort}",
"templated": true
}
},
"_embedded": {
"applications": [{
"displayname": "One",
"description": "My Test Application!",
"locations": ["http://foo.com"],
"_links": {
"self": { "href": "http://localhost:10000/applications/one" }
}
}, {
...
}]
},
"page": {
"size": 20,
"totalElements": 7,
"totalPages": 1,
"number": 0
}
}
看起来 HATEOAS 符合我的要求。但是当我通过 MockMVC 请求时...
getMockMvc().perform(get(APPLICATIONS_ROOT)).andExpect(status().isOk()).andExpect(content().contentType(MediaTypes.HAL_JSON)).andExpect(jsonPath("$._embedded.applcations", hasSize(5))).andReturn();
响应中没有符合 HATEOAS 的元素,因此我的测试在 jsonPath 检查中失败:
{
"page" : 0,
"size" : 10,
"sort" : null,
"total" : 5,
"applications" : [ {
"name" : "one",
"version" : "1.0",
...
我尝试在 MockMVC 方法的 GET 请求中更改 ContentType,但没有任何区别。在浏览器中,我没有设置任何特定的内容类型、标题等。
我知道 MockMVC 类使它的 HTTP 请求与通常的 RestTemplate 有某些不同,所以也许是这样的?任何人都可以看到我遗漏的任何明显内容吗?
如果需要,我会添加额外的代码,但这会使问题变得比现在更冗长。
【问题讨论】:
-
查看 MockMVC 配置 - 我认为您缺少其他配置选项(可能是为了支持 HATEOS 的东西)。抱歉,我没有真正的答案,只是直觉。
-
我的建议是查看从浏览器发起的请求中设置的所有标头,因为每个浏览器设置不同的标头,然后在 mockMvc 请求中设置相同的标头,特别是寻找
Accept标头.来自 mockMvc 的响应看起来像是未包装的,并且以_开头的属性被重命名... -
@cjstehno - 直觉没有错 :) 我会看看他们。 NikolayRusev - 我注意到响应确实包含不同的分页键这一事实。这就是我目前正在研究的内容,看看是否可以解决这个问题。
-
这绝对是非常奇怪的行为我会关注这个线程:) 你能发布你的 mockmvc 配置吗?
-
我将尝试获取一个示例项目来说明 GitHub 上的行为。会比尝试在此处发布大量代码要容易一些。
标签: java spring spring-mvc spring-hateoas