Solución:
Puede usar la anotación @ResponseStatus. De esta manera, puede tener un método vacío y no tiene que construir una ResponseEntity.
@DeleteMapping(value = HERO_MAPPING)
@ResponseStatus(value = HttpStatus.NO_CONTENT)
public void delete(@PathVariable Long heroId) {
heroService.delete(heroId);
}
Por cierto, devolver 200 cuando el objeto existe y 204 de lo contrario es un poco inusual con respecto al diseño de API REST. Es común devolver un 404 (no encontrado) cuando no se encuentra el objeto solicitado. Y esto se puede lograr utilizando un ControllerAdvice.
En Spring REST es mejor manejar Excepciones con un manejador de Excepciones en lugar de poner lógica para decidir el estado de la respuesta, etc. Este es un ejemplo usando la anotación @ControllerAdvice: http://www.jcombat.com/spring/exception-handling- servicio-web-relajante-en-primavera
Por supuesto que sí.
Opción 1 :
@RestController
public class RepoController {
@RequestMapping(value = "/document/{id}", method = RequestMethod.GET)
public Object getDocument(@PathVariable long id, HttpServletResponse response) {
Object object = getObject();
if( null == object ){
response.setStatus( HttpStatus.SC_NO_CONTENT);
}
return object ;
}
}
Opcion 2 :
@RestController
public class RepoController {
@RequestMapping(value = "/document/{id}", method = RequestMethod.GET)
public Object getDocument(@PathVariable long id) {
Object object = getObject();
if ( null == object ){
return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
}
return object ;
}
}
Puede tener errores tipográficos, pero entiendes el concepto.
Resolví este problema con un filtro. Es global y simple.
package your.package.filter;
import org.springframework.http.HttpStatus;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class NoContentFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
filterChain.doFilter(httpServletRequest, httpServletResponse);
if (httpServletResponse.getContentType() == null ||
httpServletResponse.getContentType().equals("")) {
httpServletResponse.setStatus(HttpStatus.NO_CONTENT.value());
}
}
}
y agregue lo siguiente en su web.xml
<filter>
<filter-name>restNoContentFilter</filter-name>
<filter-class>your.package.filter.NoContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>restNoContentFilter</filter-name>
<url-pattern>/rest/*</url-pattern>
</filter-mapping>