2017-02-08 11 views
0

私は中規模のソフトウェア会社のソフトウェアエンジニアであり、しばらくの間、安静時のフレームワークに取り組んでいます。彼らは、Java8インターフェイスのデフォルトメソッドについてのすばらしいものです。だから、私はCRUD機能を実装するために、このデフォルトの動作を使用することに決めました。それぞれのインタフェースは、それ自身のインタフェースで分離されています(ICreateResource)。 CRUDメソッドで実行されるロジックは、インターフェイスとして宣言された余分なクラスによって提供されますIResourceStateControlJax-rs、JavaEE7、Java8:SystemInjecteeImplで注入可能なオブジェクトがありません

ここに問題があります。 ICreateResource例外を実装RatingResourceStateBeanIResourceStateControlを実装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アプリケーションサーバーに配備されています。

よろしく ルディ

答えて

0

あなたはJAX-RSは、デフォルトの方法である、ICreateResource.post@Context UriInfo uriInfoをRESOURSE注入しようとしています。 JAX-RS APIはJava 7をベースにしているので、デフォルト・メソッドの使い方に注意する必要があります。リフレクションAPIがどのようにデフォルトメソッドに関する情報を公開するかによって異なります。

がデフォルトのメソッドをオーバーライドしていますが、@Contextアノテーションをコピーしていない可能性もあります。サーバーがクラスをスキャンすると、(デフォルトのメソッドが存在しないかのように)メソッドシグネチャ内に@Contextアノテーションが表示されません。

+0

はいこれが答えです。インターフェイスのgetterメソッドで "@context"メンバにアクセスすると、GETでは動作しますが、POSTでは動作しません。しかしそれは別の問題かもしれません。 – rudi

関連する問題