Spring MVC-休息控制器响应类型为空时自动返回204 - java

我试图让当控制器方法响应类型为void时spring自动返回HTTP Status 204。例如:

假设我有一个像这样的控制器方法:

@DeleteMapping(value = "/{heroId}")
public void delete(@PathVariable Long heroId) {
    heroService.delete(heroId);
}

我正在寻找一种自动返回204的方法,而不必使用@ResponseStatus(value = HttpStatus.NO_CONTENT)注释该方法。

是否可以通过处理程序或AOP或其他工具来执行此操作?

PS。我看到了这个答案,Return HTTP 204 on null with spring @RestController,但是没有回答我的具体问题,即如何对具有void返回类型的方法实现此问题。同样,此方法应与没有输入参数的方法一起使用。

参考方案

我能够根据Yoshua提供的链接实施解决方案。我不确定100%的实现细节,但是它对我有用。

这将从所有返回类型为void的控制器方法中捕获响应,并将其HTTP状态更改为204。

import org.springframework.core.MethodParameter;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@ControllerAdvice
public class NoContentControllerAdvice implements ResponseBodyAdvice<Void> {

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        if(returnType.getParameterType().isAssignableFrom(void.class)) {
            return true;
        }

        return false;
    }



    @Override
    public Void beforeBodyWrite(Void body, MethodParameter returnType, MediaType mediaType,
            Class<? extends HttpMessageConverter<?>> converterType, ServerHttpRequest request, ServerHttpResponse response) {

        if(returnType.getParameterType().isAssignableFrom(void.class)) {
            response.setStatusCode(HttpStatus.NO_CONTENT);
        }

        return body;
    }
}

Spring MVC:如何获取请求的处理程序方法 - java

我正在尝试根据Spring @RequestMapping注释方法上存在的注释实现一些逻辑。因此,我的方法中有一个HttpServletRequest实例,我想问一下spring“给我一个方法,该方法将被调用以处理此请求”,因此我可以使用反射API来询问是否存在我的注释,因此我可以更改处理。有什么简单的方法可以从Spring MVC获取此信息? java大神…

运行项目后无法在IntelliJ中打开静态页面(Spring MVC) - java

首先,我可以像这样通过intellij按钮查看htmlenter image description here然后当我单击按钮intellij显示浏览器错误enter image description here然后我运行tomcat,然后单击浏览器按钮enter image description here我是一个初学者,我不知道为什么会发生 参考方案 您…

Spring MVC Controller测试,并模拟许多类 - java

我们的系统中有许多Controller,还有许多Spring Data存储库。我想为通过我的MVC上下文运行的控制器编写测试。但是,必须手动模拟系统中的每个服务和存储库似乎很麻烦,而且不合适,因此我可以测试控制器例如FooControllerTest.java@RunWith(SpringJUnit4ClassRunner.class) @WebAppCon…

在每个jsp页面中包括CSS和js文件 - java

我在每个jsp文件中都包含常见的css和js文件。那么在每页中包含它们的最佳实践是什么?我曾经使用<%@ include file="header.jsp" %>,但是我想知道这是否是最好,最干净的方法。 参考方案 最好的解决方案是使用JSP标记文件。它允许使用标签文件封装可重复使用的内容:Java doc ref这是一个很好…

将JSON发布到Spring MVC Controller返回400错误请求 - java

我想发布JSON并让Jackson将其转换为POJO,但是现在我什至无法发布简单的String参数。我正在使用Jackson 2.3.2(jackson-core和jackson-databaind)我正在使用Spring 3.2.8.RELEASE(spring-context,spring-webmvc)我的控制器如下所示:@RequestMapping…