2016-05-19 5 views
0

私のdbで取得した画像を表示する際に問題が発生しました。primfaces graphicimage CDI Beanが動作しない

ビューの呼び出し元:

<p:graphicImage value="#{appController.image}" height="200 px" > 
     <f:param name="oid" value="#{item.oid}" /> 
</p:graphicImage> 

コントローラー:

@Named("appController") 
@ApplicationScoped 
public class AppController { 

    @Inject 
    private MultimediaFacade multimediaFacade; 

    public StreamedContent getImage() throws IOException { 
     System.out.println("getting image") 
     FacesContext context = FacesContext.getCurrentInstance(); 
     if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { 
      // So, we're rendering the HTML. Return a stub StreamedContent so that it will generate right URL. 
      return new DefaultStreamedContent(); 
     } else { 
      // So, browser is requesting the image. Return a real StreamedContent with the image bytes. 
      String imageId = context.getExternalContext().getRequestParameterMap().get("oid"); 
      int oid=Integer.parseInt(imageId); 
      System.out.println(oid); 
      Multimedia image = multimediaFacade.find(oid); 
      System.out.println(Arrays.toString(image.getFileBlob())); 
      return new DefaultStreamedContent(new ByteArrayInputStream(image.getFileBlob())); 
     } 
    } 
} 

このコードは何も示していないと、それはメソッドが呼び出されないように(コンソールで印刷ことはありません)になります!

私はスコープを変更した後、@ ManagedBeanを@Namedの代わりに使用しようとしましたが、動作します。

誰かが@ManagedBeanでのみ動作し、@Namedでは動作しない理由を説明できますか?

+1

' javax.enterprise.context.ApplicationScoped' JSFのためのjavax.faces.bean.ApplicationScoped' – Geinmachi

+0

これは範囲の問題ではありません – Marco

+0

CDI Beanは「普通の」ページでうまく動作します。 – BalusC

答えて

1

javax.enterprise.context.ApplicationScopedがインポートされていることを確認してください。

あなたが(例えばjavax.faces.bean.ApplicationScoped@ApplicationScopedごとに異なるインポートを持っている場合は、あなたがすべてのBeanのための発見をTUNするためにのみ(デフォルト)CDI注釈

を有するものをすべてのBeanを発見する代わりにするためにCDIを設定する必要があります、WEB-INFディレクトリに空のbeans.xmlを追加するか、またはあなたはすでにそこbeans.xmlのを持っている場合、このように、<beans>要素にbean-discovery-mode="all"を追加し、次のいずれか `、CDI用

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
     bean-discovery-mode="annotated"> 
</beans> 
+0

あなたは完全に正しいです!だから、問題はCDIの実装(enterprise.contexr vs faces.beans)に関するものでした。 – Marco

+0

注釈の中には、実際にはパッケージ名に注意する必要があります。 javaxパッケージには注釈の倍数がありますが、名前は同じですがパッケージが異なるため、意味が異なります。例えば。 [@Singleton](http://docs.oracle.com/javaee/7/api/javax/ejb/Singleton.html)および[@Singleton](http://docs.oracle.com/javaee/7/api) /javax/inject/Singleton.html)。それらは異なる仕様から来ているため、混在することはできません。 – OndrejM

+0

CDIについて詳しくは、http://cdi-spec.org/で、特にBeanの発見についてはhttp://docs.jboss.org/cdi/spec/1.2/cdi-specをご覧ください。 html#type_discovery_steps – OndrejM

関連する問題