8

Richfaces 4ショーケースのコードを変換して、JSFアノテーションの代わりにCDIを使用しようとしています。

@Named交換@MangedBeanおよび@Inject交換に使用できることを理解してい@ManagedPropertyます。しかし、私はいくつかの問題を抱えています。RichFacesツリーの例を具体的に変換しようとしています。

私は次の変更を行いましたが、これは正しくないことがわかっているので、これを使用しないでください。

//@ManagedBean
//@ViewScoped
@Named
@SessionScoped
public class TreeBean implements Serializable {
    private static final long serialVersionUID = 1L;
//    @ManagedProperty(value = "#{cdsParser.cdsList}")
//    private List<CDXmlDescriptor> cdXmlDescriptors;
    @Inject
    private Instance<CDXmlDescriptor> cdXmlDescriptors;
// I also Tried :
//  @Inject
//    private CDParser cdsParser;
//    private List<CDXmlDescriptor> cdXmlDescriptors = cdsParser.getCdsList();

........

それから私は追加しました(そしてこれが必要かどうかはわかりません):

@Named
@SessionScoped
public class CDXmlDescriptor implements Serializable { ...

変更:

//@ManagedBean(name = "cdsParser")
@Named("CDParser")
//@Named
@SessionScoped
public class CDParser implements Serializable{
    
    /**
     * 
     */
    private static final long serialVersionUID = 3890828719623315368L;
    @Named
    private List<CDXmlDescriptor> cdsList;

@ManagedProperty(value = "#{cdsParser.cdsList}")CDIを使用して置き換える適切な方法がわかりませんか?

4

1 に答える 1

9

JSF 2.3以降では、これに使用できますjavax.faces.annotation.ManagedProperty。これは古いものと同じように機能し、JSF 2.3は非推奨javax.faces.bean.ManagedPropertyになったため、追加するだけ@Injectで済みます。

例:

import javax.faces.annotation.ManagedProperty;
...
@Inject
@ManagedProperty(value = "#{cdsParser.cdsList}")
private List<CDXmlDescriptor> cdXmlDescriptors;

JSF 2.3以降をまだ使用していない場合は、注入可能にするためにプロデューサーフィールドまたはプロデューサーメソッドが必要です。

プロデューサーフィールドの例:

import javax.enterprise.inject.Produces;
...
@Named 
@Produces 
private List<CDXmlDescriptor> cdsList;

プロデューサーメソッドの例:

import javax.enterprise.inject.Produces;

private List <CDXmlDescriptor> cdsList;
...
@Named("cdsList") 
@Produces 
public List<CDXmlDescriptor> getCdsList {
  return cdsList;
};

これは、同じBeanタイプを返すプロデューサーフィールドまたはプロデューサーメソッドが他にない場合に機能します。それ以外の場合は、あいまいさを解決するために、プロデューサーフィールドに特別な修飾子を導入する必要があります。

import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.inject.Qualifier;


@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface CdsList {
}

@Named @Produces @CdsList
private List<CDXmlDescriptor> cdsList;
于 2012-03-30T07:11:17.307 に答える