2016-05-19 10 views
2

Ich habe eine Jersey-REST-API, die 204 zurückgibt Kein Inhalt anstelle von 404, wenn die zurückzugebende Entität null ist.Rückgabe von HTTP 404 anstelle von HTTP 204 Antwortcode für Nullwerte in Jersey

Um dieses Problem zu beheben, plane ich derzeit, eine Ausnahme innerhalb der Ressource-Methode zu werfen, so dass es Jersey zwingen konnte, 404 wie unten zurückzugeben.

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

Aber ich habe verschiedenen REST URIs, die aus dem gleichen Problem leiden. Gibt es eine Möglichkeit, alle anzugehen, ohne jede einzelne Ressourcenmethode zu berühren?

Meine Ressource Methoden wie folgt aussehen:

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

Sie können Ihren eigenen Antwortcode über das Response-Objekt senden. – markbernard

Antwort

1

können Sie ContainerResponseFilter implementieren und anpassen, um die Antwort auf der Grundlage Ihrer Anforderung.

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

}

den obigen Code anpassen und Ihre Geschäftslogik implementieren.

+0

Dank @siva werde ich das ausprobieren ... –

1

Sie können Filter Anfrage oder Antwort verwenden, hängt davon ab, was Sie für null überprüfen möchten.

Kontrolle der docs here