我的primefaces pickList源和目标值不会改变,我已经在primefaces showcase中跟踪了示例, 并且在这里查看了几个帖子,但仍然无法解决问题.我正在使用数据库中的列表来填充源代码,如下所示:
private DualListModel<Course> courseModel;
public CourseBean() {
List<Course> target = new ArrayList<Course>();
List<Course> source = new ArrayList<Course>();
courseModel = new DualListModel<Course>(source, target);
}
...
//this DualListModel getter also populates the source with values from db
public DualListModel<Course> getCourseModel() {
courseModel.setSource(getCourseList());
return courseModel;
}
Run Code Online (Sandbox Code Playgroud)
我的转换器是
import org.omnifaces.converter.SelectItemsConverter;
@FacesConverter("courseConverter")
public class CourseConverter extends SelectItemsConverter {
@Override
public String getAsString(FacesContext context, UIComponent component,
Object value) {
Integer id = (value instanceof Course) ? ((Course) value).getId()
: null;
return …Run Code Online (Sandbox Code Playgroud) 在基本注册屏幕(带有按钮注册记录屏幕)中,有两个面板:
数据面板:

地址面板:

我只能通过完成“数据”面板进行注册。不必填写“地址”面板。但是,如果填写了“地址”面板的至少一个字段,则应要求同一面板中的所有其他字段。

我该如何实现?
我有以下页面:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:o="http://omnifaces.org/ui"
xmlns:thehub="http://java.sun.com/jsf/composite/components/thehub"
template="/templates/masterTemplate.xhtml">
<f:metadata>
<f:viewParam
id="returnToViewParam"
name="returnTo"
value="#{loginMB.returnTo}"
required="true" />
<f:viewParam
id="oauth_verifierViewParam"
name="oauth_verifier"
value="#{loginMB.oauth_verifier}" />
<f:viewParam
id="oauth_tokenViewParam"
name="oauth_token"
value="#{loginMB.oauth_token}" />
<f:event
type="preRenderView"
listener="#{loginMB.preRenderView()}" />
</f:metadata>
<ui:define name="body">
<o:form
id="loginForm"
includeViewParams="true">
<div class="form-vertical well">
<h4>New Users</h4>
<h5>
<h:link outcome="signup">Click here to create an account</h:link>
</h5>
<hr />
<h4>Existing Users</h4>
<h:commandButton
id="googleLoginCommandLink"
styleClass="btn"
action="#{loginMB.redirect()}"
value="Google">
<f:param
name="returnTo"
value="#{param.returnTo}" />
</h:commandButton>
<div class="clearfix"></div>
</div>
</o:form>
</ui:define> …Run Code Online (Sandbox Code Playgroud) 我有一个大的应用程序作用域内容缓冲区,我想保留在内存中.使用Omnifaces让我们很容易做到这一点.
但是,如果我需要使缓存过期,似乎没有方法可以这样做.如果需要,我可以设置时间属性,但这似乎并不是这个难题的理想答案.
有关强制更新基础数据的任何建议吗?
谢谢,
Temar
我在Tomcat7和JSF 2.1中使用OmniFaces FullAjaxExceptionHandler来处理ViewExpiredException.我设置了与OmniFaces展示相同的错误页面.在这里查看错误页面,这里是模板.
它工作正常.当会话过期时,我最终会出现expired.xhtml错误页面.但是,当我单击错误页面中的以下链接时,
<p><a href="#{requestScope['javax.servlet.error.request_uri']}">Back to initial page.</a></p>
Run Code Online (Sandbox Code Playgroud)
然后我得到以下异常:
com.sun.faces.mgbean.ManagedBeanCreationException: An error occurred performing resource injection on managed bean
Run Code Online (Sandbox Code Playgroud)
这不是一个大问题.无论如何,我需要一个将用户指向主页的按钮.所以我用下面的按钮替换它:
<h:button value="Home" outcome="logout" />
Run Code Online (Sandbox Code Playgroud)
以及此导航案例:
<navigation-rule>
<from-view-id>*</from-view-id>
<navigation-case>
<from-outcome>logout</from-outcome>
<to-view-id>/stdPortal/index.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
Run Code Online (Sandbox Code Playgroud)
导航将我带到了正确的页面,但会话ID显示在URL中:
https://localhost/stdPortal/index.xhtml;jsessionid=B68784B4ED8882A6575A2EE4012AF1B5
Run Code Online (Sandbox Code Playgroud)
我不想要这个.我怎么摆脱它?我希望网址如下:
https://localhost/stdPortal/index.xhtml
Run Code Online (Sandbox Code Playgroud) 我有一个像这样的地址实体:
@Entity
public class Address implements java.io.Serializable {
@Id @GeneratedValue(strategy = IDENTITY)
private Long id;
@Size(max = 100)
private String street;
@Size(max = 15)
private String nr;
@Field
@Size(min = 1, max = 20) @NotBlank
private String city;
}
Run Code Online (Sandbox Code Playgroud)
这是其他几个实体的一部分.对于一个这样的实体,地址是可选的.我有一个视图,我们的用户可以通过几个表单输入编辑整个实体,包括几个地址字段.
为了能够编辑地址,我使用空地址实体初始化父实体.
现在问题是:Address当所有地址字段都为空时,我不想在实体上持久存在.为了实现这一点,我需要跳过实体的验证,如果(并且仅当)所有字段Address都为空.我该如何以最优雅的方式做到这一点?
我目前正在做的是完全跳过bean验证和<o:validateBean disabled="true" />提交按钮,null如果它是空的,则设置地址.但这听起来像是一个完全黑客,因为它在所有情况下禁用所有验证.我怎么能做得更好?
我正在尝试将JSF应用程序迁移到CDI。我已作出以下更改:
但是,Omnifaces错误阻止了部署,因为我三次遇到以下错误:
org.jboss.weld.exceptions.DeploymentException:WELD-001409类型[EagerBeansRepository]的模棱两可的依赖项,在注入点[[BackedAnnotatedField] @Inject私有org.omnifaces.ApplicationListener.eagerBeansRepository]上带有限定符[@Default]。可能的依赖关系[[带限定符[@Any @Default的托管Bean [类org.omnifaces.cdi.eager.EagerBeansRepository]],带限定符[@Any @Default的托管Bean [类org.omnifaces.cdi.eager.EagerBeansRepository]] ]
我已降级为Omnifaces 1.8.1,并且部署成功。为什么Omnifaces 2.0导致此错误?
开发环境:
我使用javax.inject.Named并javax.enterprise.context.*Scoped加org.omnifaces.cdi.ViewScoped来定义我的观点豆的生活范围.
现在我想获得所有实例化bean的列表.首先,我认为这篇博客文章涵盖了这个问题,但它只列出了@ManagedBeans.
你知道如何列出它们吗?如果不修复JavaEE的实现甚至版本,这是否可行?
亲切的问候,六甲
PS:我已经找到了org.omnifaces.cdi.BeanStorage,但我不知道如何访问它的地图.
为了缩小范围,我们正在从Jboss 6 EAP(JSF 2.1)升级到Jboss 7 EAP(JSF 2.2)。我们的工作应用程序现在遇到OmniFaces ViewScoped bean问题。
版本:
我们有一个这样的数据表:
<p:dataTable id="tblLegalHolds" widgetVar="tableLegalHolds" var="row"
rowKey="#{row.id}" filterEvent="enter"
lazy="true"
value="#{bean.lazyDataModel}"
rows="15">
Run Code Online (Sandbox Code Playgroud)
注意:我们的bean是OmniFaces ViewScoped,此时我们的表工作正常!
问题: 接下来,我们添加一列,其中包含到新页面的导航,如下所示:
<p:column width="60" exportable="false">
<p:button value="Open" outcome="legal-hold-edit">
<f:param name="id" value="#{row.id}" />
</p:button>
</p:column>
Run Code Online (Sandbox Code Playgroud)
现在我们的bean立即被加载和卸载,如果我们执行HTML的查看源,我们将看到Omnifaces脚本被添加了两次,就像这样……
OmniFaces.Unload.init('f1c1ff81-c87f-4406-b98f-a3eaff977e96');
OmniFaces.Unload.init('45e7de9d-53c7-4426-a972-797c48c46733');
Run Code Online (Sandbox Code Playgroud)
我们在ViewScoped bean中添加了@PostConstruct,以证明它被两次调用。对于该导航,我们的faces-config.xml看起来像这样。
<navigation-case>
<from-outcome>legal-hold-edit</from-outcome>
<to-view-id>/legal/legal-hold-edit.xhtml</to-view-id>
<redirect include-view-params="true"/>
</navigation-case>
Run Code Online (Sandbox Code Playgroud)
现在有趣的是,如果我们删除faces-config.xml中的“ include-view-params”,就像下面的代码一样,一切将开始正常运行,则只创建了一次ViewScoped bean,并且仅向其中添加了1个OmniFaces.Unload.init脚本。页。
<navigation-case>
<from-outcome>legal-hold-edit</from-outcome>
<to-view-id>/legal/legal-hold-edit.xhtml</to-view-id>
<redirect/>
</navigation-case>
Run Code Online (Sandbox Code Playgroud)
另外要注意的是,我们的结果页使用o:viewparam接收如下参数:
<f:metadata>
<o:viewParam name="id" value="#{legalHoldForm.legalHold}" required="false" />
<f:event type="preInvokeAction" listener="#{controller.initializeViewLegalHold}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
我已经实现了Omnifaces FullAjaxExceptionHandler,但问题是它无法使用ajax请求.会话到期后,当我点击非ajax按钮时,它运作良好.它将用户重定向到自定义错误页面.但是如果按钮使用ajax,它什么都不做.页面只是卡住了.
编辑:我已将ActionListener更改为Action并仍然相同.
Edit2:它没有错误.既不是Apache Tomcat输出也不是Apache Tomcat Log.

这是我的春天安全;
<http auto-config='true' use-expressions="true">
<intercept-url pattern="/login" access="permitAll"/>
<intercept-url pattern="/ajaxErrorPage" access="permitAll"/>
<intercept-url pattern="/pages/*" access="hasRole('admin')" />
<intercept-url pattern="/j_spring_security_check" access="permitAll"/>
<logout logout-success-url="/login.xhtml" />
<form-login login-page="/login.xhtml"
login-processing-url="/j_spring_security_check"
default-target-url="/pages/index.xhtml"
always-use-default-target="true"
authentication-failure-url="/login.xhtml"/>
</http>
Run Code Online (Sandbox Code Playgroud) omnifaces ×10
jsf ×6
jsf-2 ×5
primefaces ×3
cdi ×2
facelets ×1
glassfish ×1
java ×1
jsessionid ×1
jsf-2.2 ×1
validation ×1
weld ×1