How to return HTTP 404 instead of HTTP 204 response code for null values in jersey

﹥>﹥吖頭↗ 提交于 2021-01-28 05:04:17

问题


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

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);

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?

My resource methods look like this:

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();
    }
} 

回答1:


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

ex:

@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.




回答2:


You can use Request or Response filters depends on what you want to check for null.

check the docs here



来源:https://stackoverflow.com/questions/37327582/how-to-return-http-404-instead-of-http-204-response-code-for-null-values-in-jers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!