2016-04-13 6 views
0

Wenn ich eine Anfrage an meinen JAX-RS-Pfad mit einem leeren Textkörper erhalte, erhalte ich den Fehler 500 als Antwort. Wenn ich einen Körper mit {} sende, ist das ok, da es interpretiert, dass es ein JSON ist.So ändern Sie INTERNAL_SERVER_ERROR, wenn der Server @ JSON anfordert und die Anforderung ist leer

Ich möchte den Fehlercode 400 BAD_REQUEST zurückgeben können, da dies meines Erachtens ein Clientfehler ist.

@PUT 
@Produces(APPLICATION_JSON) 
@Consumes(APPLICATION_JSON) 
@Path("/up") 
public Response signUp(Credentials credentials) { 

Ich bin mit Jersey und für die JSON-Mapper diese Bibliothek:

org.glassfish.jersey.media:jersey-media-json-jackson:2.22.2' 
+0

Das scheint seltsam, dass eine Bibliothek so groß wie die in einer solchen Art und Weise verhalten würden. Was sagt die Stack-Spur aus, ist die Quelle des 500-Fehlers? – Dogs

Antwort

0

Erstellen eines benutzerdefinierten Anbieters Ihre JSON Nutzlast deserialise und Ihre Logik anschließen. Ich nehme an, dass Sie JAXB Annotation in Ihren Klassen verwenden.

import java.io.IOException; 
import java.io.InputStream; 
import java.lang.annotation.Annotation; 
import java.lang.reflect.Type; 

import javax.ws.rs.BadRequestException; 
import javax.ws.rs.Consumes; 
import javax.ws.rs.WebApplicationException; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.MultivaluedMap; 
import javax.ws.rs.ext.MessageBodyReader; 
import javax.ws.rs.ext.Provider; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.bind.annotation.XmlRootElement; 

import com.sun.jersey.api.json.JSONJAXBContext; 
import com.sun.jersey.api.json.JSONUnmarshaller; 

@Provider 
@Consumes({MediaType.APPLICATION_JSON}) 
public class MyJsonReaderProvider<T> implements MessageBodyReader<T> { 

    @Override 
    public boolean isReadable(Class<?> type, 
           Type genericType, 
           Annotation[] annotations, 
           MediaType mediaType) { 
     return type.isAnnotationPresent(XmlRootElement.class); 
    } 

    @Override 
    public T readFrom(Class<T> type, 
         Type genericType, 
         Annotation[] annotations, 
         MediaType mediatype, 
         MultivaluedMap<String, String> headers, 
         InputStream inputStream) throws IOException, 
      WebApplicationException { 
     try { 

      JAXBContext jc = JSONJAXBContext.newInstance(type); 
      Unmarshaller unmarshaller = jc.createUnmarshaller(); 

      JSONUnmarshaller jsonUnmarshaller = JSONJAXBContext.getJSONUnmarshaller(unmarshaller); 
      T object = (T) jsonUnmarshaller.unmarshalFromJSON(inputStream, type); 
      return object; 

     } catch (JAXBException e) { 
      throw new BadRequestException("Bad Request"); 
     } 
    } 
} 

den Anbieter in Ihrem javax.ws.rs.core.Application Registrieren

+0

Während ich nicht bezweifle, dass das funktionieren wird, wäre es eine Schande, wenn der Thread-Starter zu dieser Länge gehen müsste. – Dogs