4

アプリケーションのテーブルからユーザーを削除または編集しようとすると、変換エラーが発生します。listUser.xhmtl値は、からページへのメタデータで渡されdeleteUser.xhtmlます。値はメタデータで渡されていますが、何らかの理由で削除アクションを呼び出すと、が取得されConversion Error setting value "someemail@somedomain.com" for 'null Converter'ます。ユーザーIDは文字列です。

これは、userDelete.xhmtlをリクエストした後のURLです。

http://localhost:8080/lavpWebApp/user/deleteUser.xhtml?user=someemail%40somedomain.com

これは、userList.xhmtlを簡略化したものです。

<h:column>
                            <f:facet name="header">Edit</f:facet>
                            <h:link outcome="/user/editUser.xhtml" value="Edit User">
                                <f:param name="user" value="#{item.email}"/>
                            </h:link>                            
                        </h:column>

                        <h:column>
                            <f:facet name="header">Delete</f:facet>
                            <h:link outcome="/user/deleteUser.xhtml" value="Delete User">
                                <f:param name="user" value="#{item.email}"/>
                            </h:link>
                        </h:column>

これはuserDelete.xhtmlを簡略化したものです。

<f:metadata>
        <f:viewParam name="user" value="#{userController.user}" converter="#{userConverter}"/>
    </f:metadata>

    <h:body>
        Do you want to delete #{userController.user.name}?
        <h:form>
            <h:commandButton action="#{userController.deleteUser()}"
                             value="Delete"/>
            <h:commandButton action="#{userController.doCancelDeleteUser()}"
                             value ="Cancel"/>
        </h:form>
    </h:body>

これはConverterクラスです:

@ManagedBean
@FacesConverter(value="userConverter")
public class UserConverter implements Converter{

    @EJB
    private UserSellerEJB userEjb;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value == null || value.isEmpty())
        {
            return null;
        }
        if(!value.matches("\\d+"))
        {
            throw new ConverterException("The value is not a valid email: " + value);
        }

        String id = value.toString();
        return userEjb.findUserById(id);

    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if(value == null)
        {
            return null;
        }

        if(!(value instanceof UserSeller))
        {
            throw new ConverterException("The value is not a User: " + value);            
        }

        String id = ((UserSeller) value).getEmail();
        return (id != null) ? id.toString() : null;
    }

}

これは簡略化されたuserControllerクラスです。

@Named
@RequestScoped
public class UserController{

    @EJB
    private UserSellerEJB userEJB;

    private UserSeller user = new UserSeller(); 
    private List<UserSeller> usersList = new ArrayList<UserSeller>();

    // ------------------------------------------------------------- Constructor
    public UserController() {
    }

    // -------------------------------------------------------- Business Methods

    public String doCreateUser()
    {
        user = userEJB.createSeller(user);
        usersList = userEJB.findAllSellers();
        return "listUser?faces-redirect=true";        
    }

        // update user

        public void PreRenderView()
        {
            if(user == null)
            {
                user = new UserSeller();
            }            
        }

        public String doUpdateUser()
        {
            if(user.getEmail() != null)
            {
                userEJB.updateSeller(user);
            }
            else
            {
                userEJB.createSeller(user);
            }

            return "listUser?faces-redirect=true";
        }

    public String deleteUser()
    {
        userEJB.deleteSeller(user);
        return "listUser?faces-redirect=true";
    }

    public String doCancelDeleteUser()
    {
        return "listUser?faces-redirect=true";
    }


    @PostConstruct
    public void init()
    {
        usersList = userEJB.findAllSellers();       
    }
4

1 に答える 1

5

例外メッセージのnull converterは、コンバータインスタンスが見つからないことを示しています。によって管理対象Beanとしてコンバーターを参照しているため、コンバーターにconverter="#{userConverter}注釈が付けられ@javax.faces.bean.ManagedBean、クラスがWARにある場合(したがって、EJB / EARやその他の場所にはない場合)にのみ検出されます。

注釈はこの@FacesConverter構成では使用されておらず、実際には不要であり、初心者にとっては混乱を招くだけです。その注釈を削除します。@EJB確かに、管理されたBeanでのみ機能します。

本当に無駄な場合(ただし、理由を説明できませんでした)、代わりにCDIで管理してみてください。JSF@ManagedBeanアノテーションをCDI@Namedアノテーションに置き換えてください。どうやら、CDIによるフロントコントローラーBeanの管理はすでに成功しているようです。


具体的な問題とは関係なく、コンバーターは、電子メールアドレスではなく、技術ID(DB主キー)に基づいて変換するように設計されているようです。電子メールアドレスは決して一致することはできません\d+(これは「数字のみ」の正規表現です)。メールアドレスとIDを混同しないように注意してください。

于 2012-11-12T11:50:16.410 に答える