所以基本上我的应用程序是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第二。记得不要混 不同技术的注释。