Jersey を使用した JAX-RS REST サービスがあります。JSONマーシャリングにJAXBを使用します(つまり、@XmlRootElement)メソッドの1つは、JPAで永続化されたオブジェクトのリストを返します。
このリストにエントリが含まれている場合、期待どおりに機能します。例:
{"androidDevice":[{"email":"dagfinn.parnas@d2.no","timeCreated":"2012-10-19T
22:41:26.862+02:00"},{"email":"dagfinn.parnas@d1.com","timeCreated":"2012-10-
19T22:41:38.093+02:00"}]}
ただし、リストが空 (または null) の場合は、{} が返されることを期待します。
代わりに null を返します。例:
$ curl -i -H "Accept: application/json" http://....
HTTP/1.1 200 OK
Content-Type: application/json
null
ここにコードがあります
@GET
@Produces( { MediaType.APPLICATION_JSON , MediaType.APPLICATION_XML})
public List<AndroidDevice> getAndroidDevices() {
logger.info("getAndroidDevices method called");
EntityManager entityManager = entityMangerFactory.createEntityManager();
List<AndroidDevice> resultList = entityManager.createNamedQuery(AndroidDevice.QUERY_ALL_ENTRIES,
AndroidDevice.class).getResultList();
//avoid returning content null. (doesn't work)
if(resultList==null){
resultList=new ArrayList<AndroidDevice>();
}
return resultList;
}
Jersey が空の JSON リストを返すようにする方法はありますか (ResponseBuilder をハードコーディングする以外に) ?
代わりに、そのようなイベントに対して別の応答コードを提供する必要がありますか?
更新: このバグ レポートに関するヒントを Twitter で入手しました。このバグ レポートは、修正されないという結論に達しました。
Update2: 以下のソリューションに加えて、構成用のアプリケーション (web.xml で参照) を使用していたため、そこに Provider クラスを手動で追加する必要がありました。関連するコードは次のとおりです。
public class JAXRSApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> set = new HashSet<Class<?>>();
//Add all endpoints to this set
set.add(AndroidDeviceEndpoint.class);
//Add Providers
set.add(JAXBContextResolver.class);
return set;
}
}