2016-04-13 2 views
0

Когда я отправляю запрос на мой путь JAX-RS с пустым телом, я получаю ошибку 500 в качестве ответа. Если я отправил тело с {}, это нормально, поскольку он интерпретирует это JSON.Как изменить INTERNAL_SERVER_ERROR, когда сервер @Consumes JSON и запрос пуст

Я хочу, чтобы иметь возможность вернуть код ошибки 400 BAD_REQUEST, поскольку, на мой взгляд, это ошибка клиента.

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

Я использую Джерси, и для картографа JSON эту библиотеку:

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

Это кажется странным, что библиотека так велика, как будет вести себя таким образом. Что говорит трассировка стека, является источником ошибки 500? – Dogs

ответ

0

Создание пользовательского поставщика для deserialise ваш JSON полезной нагрузки и зацепить вашу логику. Я предполагаю, что вы используете аннотацию JAXB в своих классах.

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

Регистрация поставщика в вашем javax.ws.rs.core.Application

+0

Хотя я не сомневаюсь, что это сработает, было бы позором, если бы начальнику потока пришлось идти на эту длину. – Dogs