2016-04-13 10 views
0

空のボディでJAX-RSパスにリクエストを行うと、エラー500が返されます。 {}で本文を送信すると、それがJSONであると解釈されてからOKです。サーバ@Consumes JSONとリクエストが空の場合にINTERNAL_SERVER_ERRORを変更する方法

私はこのエラーがクライアントエラーであると考えているので、私はエラーコード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

あなたのJSONペイロードをdeserialiseし、あなたのロジックをフックするカスタムプロバイダを作成します。私はあなたのクラスで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

関連する問題