あなたの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でプロバイダ
を登録します。スタックトレースとは500エラーの原因です。 – Dogs