Spring TestRestTemplate 没有设置 headers

Spring TestRestTemplate doesn't set headers

我有下一个 REST 控制器方法:

    @GetMapping("/product-group")
    public List<ProductGroup> getAllProductGroups(@RequestHeader MultiValueMap<String, String> headers){
        final String header = headers.getFirst("Access-Control-Request-Method");
        assert header != null;
        return repository.findAll();
    }

并与 org.springframework.boot.test.web.client.TestRestTemplate 集成测试:

    @Test
    void allowAllHosts() {
        final HttpHeaders headers = new HttpHeaders();
        headers.setOrigin("localhost");
        headers.setAccessControlRequestMethod(HttpMethod.GET);

        final ResponseEntity<?> response = restTemplate.exchange("/product-group",
                HttpMethod.GET,
                new HttpEntity<>(headers),
                String.class);

        assertTrue(response.getHeaders().containsKey("Access-Control-Allow-Origin"), "CORS header doesn't presented");
    }

上面的测试失败 header == null。另外,我在调试器中检查了我添加的 headers 是否丢失。但呈现不同:

* "accept" -> "text/plain, application/json, application/*+json, */*"
* "user-agent" -> "Java/11.0.11"
* "host" -> "localhost:37795"
* "connection" -> "keep-alive"

为什么 TestRestTemplate 覆盖我的 headers 或者为什么它完全摆脱了它们?我怎样才能正确添加 headers?

问题来自“不允许headers”。 JDK 在请求期间忽略 headers 的预定义数组,包括 Access-Control-Request-MethodOrigin。 您可以找到详细的答案here

总之,可以添加下一行代码:

System.setProperty("sun.net.http.allowRestrictedHeaders", "true");

并且 TestRestTemplate 将包括所有 headers.