2

データベースからのプロファイルデータを表示するために使用するJavaオブジェクトを含むCDIBeanがあります。

親Bean

@Named("DCProfileTabGeneralController")
@ViewScoped
public class DCProfileTabGeneral implements Serializable
{

    public DCObj dc;

    public class DCObj
    {

        private int componentStatsId;                 // COMPONENTSTATSID   NUMBER(38,0)
        ........
        // Default Constructor
        public DCObj(){};

        public DCObj(int componentStatsId....)
        {

            this.componentStatsId = componentStatsId;
            .......

        }

        public int getComponentStatsId()
        {
            return componentStatsId;
        }

        public void setComponentStatsId(int componentStatsId)
        {
            this.componentStatsId = componentStatsId;
        }
        ....
    }

    // Getters ------------------------------------------------------------------------------------
    public DCObj getdcData()
    {
        return dc;
    }

    @PostConstruct
    public void initData() throws SQLException
    {
        initDBData();
    }

    // Generate data Object from Oracle
    public void initDBData() throws SQLException
    {
                dc = new DCObj(result.getInt("COMPONENTSTATSID"),
                .........
    }
}

バリデーター

@Named("ValidatorDatacenterController")
@ViewScoped
public class ValidatorDatacenter implements Validator, Serializable
{

    public ValidatorDatacenter()
    {
    }

    @Inject
    private DCProfileTabGeneral profileTabGeneral;


    // Validate Datacenter Name
    public void validateDatacenterName(FacesContext context, UIComponent component, Object value) throws ValidatorException, SQLException
    {
        int componentStatsId = -1;

        if (profileTabGeneral != null)
        {
            DCObj dcData = profileTabGeneral.dc;
            if (dcData != null)
            {
                componentStatsId = dcData.getComponentStatsId();
            }
        }

        if (componentStatsId == -1)
        {
            return;
        }

        String l;
        String s;

        if (value != null && !(s = value.toString().trim()).isEmpty())
        {

            if (s.length() > 18)
            {
                throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "  Value is too long! (18 digits max)", null));
            }

            if (ds == null)
            {
                throw new SQLException("Can't get data source");
            }

            Connection conn = null;
            PreparedStatement ps = null;
            ResultSet rs;
            int resComponentStatsId = -1;
            try
            {
                conn = ds.getConnection();
                // if componentsstatsid <> edited componentstatsid in jsf -> throw validator exception
                ps = conn.prepareStatement("SELECT componentstatsid from COMPONENTSTATS where NAME = ?");
                ps.setString(1, s);
                rs = ps.executeQuery();

                while (rs.next())
                {
                    resComponentStatsId = rs.getInt(1);
                }

                if (resComponentStatsId != -1 && resComponentStatsId != componentStatsId)
                {
                    throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                            "  '" + s + "' is already in use!", null));
                }

            }
            catch (SQLException x)
            {
                throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "  SQL error!", null));
            }
            finally
            {
                if (ps != null)
                {
                    ps.close();
                }
                if (conn != null)
                {
                    conn.close();
                }
            }
        }
        else
        {
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                  "  This field cannot be empty!", null));
        }

    }

}

プロファイルページからデータベースへの入力値をチェックするカスタムバリデーターがあります。@Injectを使用して親ページからJavaオブジェクトを取得し、Ojjectをバリデーターに渡すことをテストしました。@Injectを使用するたびに、空のJavaオブジェクトを取得することがわかりました。

また、CDIを使用してIntを取得することもテストしました。動作しますが、Javaオブジェクトを再度取得するために再度テストすると、空のオブジェクトが取得されます。

CDIBeanからJavaオブジェクトを呼び出す適切な方法を教えてください。CDI BeanからJavaオブジェクトを取得できないのはなぜですか?

4

1 に答える 1

4

正しく思い出せば、CDIインジェクションはバリデーターでは機能しません。deltaspikeのJSFモジュールはまだ準備ができていないため、MyfacesCODIのadvancedを使用してください。https://cwiki.apache.org/EXTCDI/jsf-usage.html

または、deltaspikeに移動し、BeanProviderを使用してインスタンスを取得します。

BeanProvider.getContextualReference(DCProfileTabGeneral .class, false);
于 2013-02-03T21:59:10.233 に答える