私は中規模のソフトウェア会社のソフトウェアエンジニアであり、しばらくの間、安静時のフレームワークに取り組んでいます。彼らは、Java8インターフェイスのデフォルトメソッドについてのすばらしいものです。だから、私はCRUD機能を実装するために、このデフォルトの動作を使用することに決めました。それぞれのインタフェースは、それ自身のインタフェースで分離されています(ICreateResource)。 CRUDメソッドで実行されるロジックは、インターフェイスとして宣言された余分なクラスによって提供されますIResourceStateControl。Jax-rs、JavaEE7、Java8:SystemInjecteeImplで注入可能なオブジェクトがありません
ここに問題があります。 ICreateResource例外を実装RatingResourceStateBeanにIResourceStateControlを実装RatingResourceStateControlを注入すると、要求を行う際に発生しません「SystemInjecteeImplの噴射に使用可能なオブジェクトがありました」。
public interface ICreateResource
{
IResourceStateControl getResourceStateControl();
@POST
@Consumes(APPLICATION_JSON)
@Produces(COLLECTION_JSON)
default Response post(@Context UriInfo uriInfo, ApplicationState representation)
{
try
{
Collection collection = getResourceStateControl().post(uriInfo, representation);
return Response.created(collection.getHref().get()).entity(collection).build();
}
catch (Exception exception)
{
throw new WebApplicationException(exception.getMessage(), exception, Response.Status.INTERNAL_SERVER_ERROR);
}
}
}
@Dependent
public class RatingResourceStateControl implements IResourceStateControl
{
@Override
public Collection get(UriInfo uriInfo, int start, int size, long parentResourceId)
{
// TODO Auto-generated method stub
return null;
}
@Override
public Collection get(UriInfo uriInfo, long id)
{
// TODO Auto-generated method stub
return null;
}
@Override
public Collection post(UriInfo uriInfo, ApplicationState representation)
{
// TODO Auto-generated method stub
return null;
}
@Override
public Boolean delete(long id)
{
// TODO Auto-generated method stub
return null;
}
@Override
public Collection put(UriInfo uriInfo, long id, ApplicationState representation)
{
// TODO Auto-generated method stub
return null;
}
@Override
public Collection patch(UriInfo uriInfo, long id, ApplicationState representation)
{
// TODO Auto-generated method stub
return null;
}
}
@Stateless
@Path("/" + RATINGS_PATH)
public class RatingResourceStateBean implements ICreateResource
{
@Inject
private RatingResourceStateControl ratingResourceControl;
@Override
public IResourceStateControl getResourceStateControl()
{
return ratingResourceControl;
}
}
ただし、機能を提供するために抽象クラスを使用する場合はすべて動作します。
public abstract class AbstractResourceState
{
protected abstract IResourceStateControl getResourceStateControl();
@Context
private UriInfo uriInfo;
@Context
private HttpServletRequest httpServletRequest;
@POST
@Consumes(APPLICATION_JSON)
@Produces(COLLECTION_JSON)
public Response post(ApplicationState representation)
{
try
{
Collection collection = getResourceStateControl().post(uriInfo, representation);
return Response.created(collection.getHref().get()).entity(collection).build();
}
catch (Exception exception)
{
throw new WebApplicationException(exception.getMessage(), exception, Response.Status.INTERNAL_SERVER_ERROR);
}
}
}
@Stateless
@Path("/" + RATINGS_PATH)
public class RatingResourceStateBean extends AbstractResourceState
{
@Inject
private RatingResourceStateControl ratingResourceControl;
@Override
protected IResourceStateControl getResourceStateControl()
{
return ratingResourceControl;
}
}
APIは抽象クラスのアプローチで取り組んでいるが、CRUDメソッドは、単に適切なインタフェースを実装することにより、利用可能なものに制御することが非常にいいだろう。すべてがpayara 4.1.1アプリケーションサーバーに配備されています。
よろしく ルディ
はいこれが答えです。インターフェイスのgetterメソッドで "@context"メンバにアクセスすると、GETでは動作しますが、POSTでは動作しません。しかしそれは別の問題かもしれません。 – rudi