如何在球衣中为空值返回HTTP 404而不是HTTP 204响应代码 [英] How to return HTTP 404 instead of HTTP 204 response code for null values in jersey

查看:53
本文介绍了如何在球衣中为空值返回HTTP 404而不是HTTP 204响应代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Jersey REST API,当要返回的实体为null时,它返回204 No content而不是404.

I have a Jersey REST API that returns 204 No content instead of 404 when the entity to be returned back is null.

为解决此问题,我目前正计划在resource方法中引发一个异常,以便它可以迫使Jersey像下面那样返回404.

To address this issue, I'm currently planning to throw an exception within the resource method so that it could force Jersey to return 404 like below.

if (feature == null) throw new WebApplicationException(404);

但是我有各种各样的REST URI遇到同样​​的问题.有没有一种方法可以解决所有这些问题,而又不涉及每种资源方法?

But I have various REST URIs that suffer from the same problem. Is there a way to address all of them without touching each and every resource method?

我的资源方法如下:

import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.example.webapi.domain.Feature;
import com.example.webapi.service.FeatureService;

@Component
@Path("features")
@Produces(MediaType.APPLICATION_JSON)
public class FeatureResource {

    @Autowired
    private FeatureService featureService;

    @GET
    public List<Feature> getFeatures() {
        return featureService.listAllFeatures();
    }

    @GET
    @Path("{featureCode}")
    public Feature getFeature(@PathParam("featureCode") Integer featuresCode) {
        return featureService.findFeatureByFeatureCode(featuresCode);
    }

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response addFeature(Feature feature, @Context UriInfo uriInfo) {
        Integer id = (Integer) featureService.createFeature(feature);
        return Response.created(uriInfo.getAbsolutePathBuilder().path(id.toString()).build()).entity(feature).build();
    }
} 

推荐答案

您可以实现ContainerResponseFilter并根据需要自定义响应.

you can implement ContainerResponseFilter and customise the response based on your requirement.

例如:

@Provider
public class LoggingResponseFilter
    implements ContainerResponseFilter {

private static final Logger logger =      LoggerFactory.getLogger(LoggingResponseFilter.class);

public void filter(ContainerRequestContext requestContext,
        ContainerResponseContext responseContext) throws IOException {
    String method = requestContext.getMethod();

    logger.debug("Requesting " + method + " for path " + requestContext.getUriInfo().getPath());
    Object entity = responseContext.getEntity();
    if (entity != null) {
        logger.debug("Response " + new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(entity));
    }
}

}

自定义上面的代码并实现您的业务逻辑.

Customize the above code and implement your business logic.

这篇关于如何在球衣中为空值返回HTTP 404而不是HTTP 204响应代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆