JSF范围错误& WELD-000227

时间:2016-06-13 23:02:54

标签: jsf glassfish cdi weld

所以基本上我的应用程序是2页应用程序在正面我将显示通过JPA连接的用户数据库中的所有用户,如果您点击用户,您将被重定向到包含更多信息的新页面。

获取用户和用户信息我正在使用连接到我的数据库的Entity类和一个扩展AbstractFacade的类来处理诸如create,edit,findAll,find和count之类的请求。

我得到两个不同的错误,我需要帮助解决。我会很感激一些可以帮助我预防未来这些问题的信息。

对于我的头版,他们目前看起来像这样:

的index.xhtml

<h:body>
        Hello from Facelets

<h1>#{indexManagedBean.helloMsg()}</h1>

<hr></hr>

<h1>Total # of users: #{userManagedBean.count()}</h1>

<h:dataTable value="#{userManagedBean.getAll()}" var="user">
    <h:column>
        <f:facet name="header">ID</f:facet>
        #{user.id}
    </h:column>
    <h:column>
        <f:facet name="header">Username</f:facet>
        #{user.username}
    </h:column>
    <h:column>
        <f:facet name="header">DisplayName</f:facet>
        #{user.displayname}
    </h:column>
    <h:column>
        <f:facet name="header">Email</f:facet>
        #{user.email}
    </h:column>
</h:dataTable>

<hr></hr>

<ul>
    <ui:repeat value="#{userManagedBean.getAll()}" var="user">
        <li>
            <h:link value="View details of #{user.displayname}" outcome="user">
                <f:param name="id" value="#{user.id}" />
            </h:link>
        </li>
    </ui:repeat>
</ul>

</h:body>

user.xhtml

<f:metadata>
        <f:viewParam name="id" value="#{userManagedBean.userId}" />
        <f:viewAction action="#{userManagedBean.init()}" />
    </f:metadata>
    <h:head>
        <title>User Details</title>
    </h:head>
    <h:body>
        <h1># #{userManagedBean.userId}</h1>
        <h:messages />
        <h:panelGrid columns="2" rendered="#{not empty userManagedBean.user}">
            <h:outputText value="ID" />
            <h:outputText value="#{userManagedBean.user.id}" />

            <h:outputText value="Name" />
            <h:outputText value="#{userManagedBean.user.displayname}" />

            <h:outputText value="Email" />
            <h:outputText value="#{userManagedBean.user.email}" />
        </h:panelGrid>
        <h:link value="Back to all users" outcome="index" />
    </h:body>

他们都从userManagedBean中的方法中获取信息,你们都可以猜到这些是托管bean。我已经阅读了有关范围的内容,我已经尝试了所有这些课程,但我似乎无法让它工作。现在在我的托管bean上使用@RequestScoped时它不一致,因为有时我会收到错误,说没有活动请求。如果我切换到@ViewScoped,我的Entity Manager类中的信息不会出现在页面上。

以下是我现在获得的错误,然后使用RequestScoped:

  

WELD-001303:范围类型没有活动上下文   javax.enterprise.context.RequestScoped

这是我的UserManagedBean类:

@Named(value = "userManagedBean")
@RequestScoped
@ManagedBean
public class UserManagedBean {

    @EJB
    private UserEntityFacade userFacade;

    String username;
    String password;
    String displayname;
    String email;
    String bio;
    String websiteurl;
    int followers;
    int follows;
    int projects;
    UserEntity user;

    private int userId;

    /**
     * Creates a new instance of UserManagedBean
     */
    public UserManagedBean() {
    }

    public void init() {

        user = userFacade.find(userId);

        if (user == null) {
            String message = "Bad request. Unknown user.";
            FacesContext.getCurrentInstance().addMessage(null, 
                new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null));
        }
    }

    /**
     * Uses the UserEntityFacade to return all user records.
     * @return 
     */
    public List<UserEntity> getAll(){
        System.out.println("getall");
        return userFacade.findAll();
    }

    /**
     * Uses the UserEntityFacade to return the user with specified id.
     * @param id - id of target user.
     * @return the UserEntity of found user.
     */
    public UserEntity getById(int id){
        return userFacade.find(id);
    }

    /**
     * Uses the UserEntityFacade to return the amount user records.
     * @return 
     */
    public int count() {
        return userFacade.count();
    }

    /**
     * Uses the UserEntityFacade to delete specified user record.
     * 
     * @param u - Target user record to be deleted.
     * @return - null
     */
    public String delete(UserEntity u) {
        userFacade.remove(u);
        return null; //Error logging ?
    }

    /**
     * Uses the UserEntityFacade to insert a new  user record.
     * 
     * @return - An URL to be redirected to.
     */
    public String add() {
        UserEntity u = new UserEntity();
        //u.setDisplayname(userBean.getDisplayName());
        //u.setUsername(userBean.getUsername());
        //u.setPassword(userBean.getPassword());

        userFacade.create(u);

        return "index";//Url ?
    }

    public void setUser(UserEntity u) {
        this.user = u;
    }

    public UserEntity getUser(){
        return this.user;
    }

     public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }
}

同样经常在开发时遇到这个WELD错误,我找不到有关的信息:

  

org.jboss.weld.exceptions.IllegalStateException:WELD-000227:Bean   检测到标识符索引不一致 - 分布式容器   可能不适用于相同的应用程序预期哈希:   2084739097当前索引:BeanIdentifierIndex [hash = -907470349,   indexed = 12]:0:   WELD%AbstractBuiltInBean%com.ibm.jbatch.container.cdi.BatchCDIInjectionExtension%的HttpSession   1:   WELD%AbstractBuiltInBean%com.sun.faces.flow.FlowDiscoveryCDIExtension%的HttpSession   2:   WELD%AbstractBuiltInBean%org.glassfish.cdi.transaction.TransactionScopedContextExtension%的HttpSession   3:   WELD%AbstractBuiltInBean%org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider%的HttpSession   4:   WELD%AbstractBuiltInBean%org.glassfish.jersey.ext.cdi1x.servlet.internal.CdiExternalRequestScopeExtension%的HttpSession   5:   WELD%AbstractBuiltInBean%org.glassfish.jersey.ext.cdi1x.transaction.internal.TransactionalExceptionInterceptorProvider%的HttpSession   6:   WELD%AbstractBuiltInBean%org.glassfish.jms.injection.JMSCDIExtension%的HttpSession   7:   WELD%AbstractBuiltInBean%org.glassfish.osgicdi.impl.OSGiServiceExtension%的HttpSession   8:   WELD%AbstractBuiltInBean%org.glassfish.sse.impl.ServerSentEventCdiExtension%的HttpSession   9:   WELD%AbstractBuiltInBean%org.hibernate.validator.internal.cdi.ValidationExtension%的HttpSession   10:WELD%AbstractBuiltInBean%root_web%HttpSession 11:   WELD%AbstractBuiltInBean%卷筒纸%的HttpSession

如果有人能够注意到我在做错的模式,请帮助我,我还没有找到很多关于JavaEE和JSF的好资源。此外,如果有人可以向我解释我在做什么时做错了,我会非常感激。此外,如果有更多的信息需要帮助我告诉我,我可以发布它!

编辑: Holger发布了一条评论,解决了WELD不一致的错误。

  

尝试将注释减少到@Named和@RequestScoped @Named和   @ManagedBean可能存在冲突。他们是一样的   功能,CDI第一,JSF第二。记得不要混   不同技术的注释。

0 个答案:

没有答案