当前位置: 首页 > 知识库问答 >
问题:

Spring的MockMVC响应与浏览器响应不匹配

赵才俊
2023-03-14

出于某种原因,如果我通过浏览器或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,并包含一个名为applicationsApplicationResource列表。这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
  }
}

看起来我很顺从。但当我通过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有一些不同,所以可能是这样的?有人能看到我明显遗漏的东西吗?

如果需要的话,我会添加额外的代码,但这会让这个问题比现在更加冗长。

共有1个答案

祁俊喆
2023-03-14

Spring HATEOAS为正确渲染hal添加了额外的配置,请查看详细信息:http://docs.spring.io/spring-hateoas/docs/0.19.0.RELEASE/reference/html/#configuration.

简而言之,它将由Jackson2HalModulehalhandler实例化器添加的适当的MixIn添加到ObjectMapper。它都是在HyperMediaSupportBeanDefinitionRegister中配置的。java(https://github.com/spring-projects/spring-hateoas/blob/master/src/main/java/org/springframework/hateoas/config/HypermediaSupportBeanDefinitionRegistrar.java)

如果使用独立的mockMvc配置,则必须手动配置ObjectMapper,以模拟spring的行为。我遇到了同样的问题,最后在测试中添加了以下配置:

mockMvc = MockMvcBuilders.standaloneSetup(controller)
        .setMessageConverters(
                new MappingJackson2HttpMessageConverter(configureObjectMapper()))
        .build();

private ObjectMapper configureObjectMapper() {
    return Jackson2ObjectMapperBuilder.json()
        .modules(new Jackson2HalModule())
        .handlerInstantiator(new Jackson2HalModule.HalHandlerInstantiator(
            new DelegatingRelProvider(
                OrderAwarePluginRegistry.create(Arrays.asList(
                    new EvoInflectorRelProvider(),
                    new AnnotationRelProvider()))),
            null))
        .build();
}
 类似资料:
  • 我尝试使用ETAG从api请求缓存json响应。我调用类似http://localhost:3000/api/config的代码,并获取: Thx响应。

  • 问题内容: 我正在通过jQuery的getJson()调用跨域Web服务。由于响应对象的大小很大,因此我在Web服务中使用了最大的JSon大小。我已经检查过getJson()提供正确的响应对象。但是仍然没有调用我的回调函数。Firebug表示已超过(firefox)响应大小。 谁能告诉我标准浏览器(例如,Firefox)处理的最大浏览器响应大小限制是多少,以及如何处理该问题? 这是相同的代码段。

  • 问题内容: 在调试用于移动Safari的Web应用程序时遇到了一个问题。该Web应用程序是相当复杂的服务器端仿真工具的前端。Web应用程序的工作原理概述如下: 向用户显示一个屏幕,在屏幕上他们填写要执行的模拟的值。 用户单击“运行模拟”,此时将对服务器进行AJAX调用。页面上的状态窗格将更新,指示正在运行模拟。一个php脚本使用POSTed值运行模拟器,并发送回一些javascript以首先更新状

  • 我在等待URL更改时得到以下错误。 这个问题是断断续续的,我并不总是得到错误。因此,如果我简单地说,它就通过了。我想这与多次调用它有关,就像它在expctedconditions中所做的那样。

  • preview和response为什么不一样? 打印是这样 渲染是这样

  • 是否可以使用MockMCV比较实际的响应实体和从控制器返回的响应实体?