java - Spring Boot App 注册 RequestContextListener 失败

标签 java spring spring-boot spring-web

我正在创建简单的 REST Controller ,为此我在我的 spring boot 应用程序中添加了 RequestContextListener 的配置

@Configuration
@WebListener
public class DataApiRequestContextListener extends RequestContextListener {

}

在 Controller 中,我尝试为成功的发布请求构建位置 header

@Async("webExecutor")
@PostMapping("/company")
public CompletableFuture<ResponseEntity<Object>> save(@RequestBody Company company) {

    Company savedCompany = companyRepository.save(company);

    URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}")
            .buildAndExpand(savedCompany.getId()).toUri();

    ResponseEntity<Object> response = ResponseEntity.created(location).build();
    LOGGER.debug("Reponse Status for POST Request is :: " + response.getStatusCodeValue());
    LOGGER.debug("Reponse Data for POST Request is :: " + response.getHeaders().getLocation().toString());
    return CompletableFuture.completedFuture(response);
}

我得到异常

java.lang.IllegalStateException: 没有当前的 ServletRequestAttributes

当我尝试在这一行使用 ServletUriComponentsBuilder 构建位置 URI 时

URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}")
                    .buildAndExpand(savedCompany.getId()).toUri();

最佳答案

如果使用 @async 则使用 fromRequestUri

@Async("webExecutor")
@PostMapping("/company")
public CompletableFuture<ResponseEntity<Object>> save(HttpServletRequest request, @RequestBody Company company) {

    Company savedCompany = companyRepository.save(company);

    URI location = ServletUriComponentsBuilder.fromRequestUri(request).path("/{id}")
                .buildAndExpand(savedOrganization.getId()).toUri();

    ResponseEntity<Object> response = ResponseEntity.created(location).build();
    LOGGER.debug("Reponse Status for POST Request is :: " + response.getStatusCodeValue());
    LOGGER.debug("Reponse Data for POST Request is :: " + response.getHeaders().getLocation().toString());
    return CompletableFuture.completedFuture(response);
}

或没有 @async 应该可以工作并返回您的位置 uri。

@PostMapping("/company")
public CompletableFuture<ResponseEntity<Object>> save(@RequestBody Company company) {

    Company savedCompany = companyRepository.save(company);

    URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}")
            .buildAndExpand(savedCompany.getId()).toUri();

    ResponseEntity<Object> response = ResponseEntity.created(location).build();
    LOGGER.debug("Reponse Status for POST Request is :: " + response.getStatusCodeValue());
    LOGGER.debug("Reponse Data for POST Request is :: " + response.getHeaders().getLocation().toString());
    return CompletableFuture.completedFuture(response);
}

关于java - Spring Boot App 注册 RequestContextListener 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52905003/

相关文章:

java - 如何将 Spring Web 应用程序上传到 cPanel?

Spring 状态机: How to get information that transition is not possible?

java - 如何在 Spring-Boot 中使用 mockito-inline?

java - 并发修改异常

java - 如何将某些内容作为小程序和应用程序运行?

Java Spring Boot Web 应用程序 : Handling 404 Exception

java - 测试 applicationContext : org. springframework.core.annotation.AnnotationUtils.getAnnotationAttributes

spring - 如何从 Spring-cloud-config 客户端中的源属性文件中读取所有属性值

java - 在主类中运行 Cucumber 和 Spring boot

java - Do while 循环不会读取循环内输入的变量