在我的JSF 2.0(在JBoss AS 7上)项目中,我想在我的ajax提交的表单上显示在开始和完成阶段触发的一个小图标状态,让最终用户知道某些事情仍在发生.
这里的主要表面没用p:ajaxStatus,因为我想在我的页面中的不同位置有许多不同的图标.
我在这个问题中找到了一些解决方案:" 如何在同一输入中显示不同的ajax状态? ",但我仍然有一个问题:为了使我的javascript函数可重用,我需要为调用提供额外的参数.
我做了这样的事情:
<h:commandLink value="do something boy!">
<f:ajax render="@form" execute="@form" listener="#{myBean.doStuff}"
onevent="showProgress" />
<f:param name="extraParam" value="extraValue" />
</h:commandLink>
Run Code Online (Sandbox Code Playgroud)
我可以看到通过请求发送到服务器的参数"extraParam",但在我的javascript showProgress方法中,我无法通过唯一给定的参数恢复它.
所以我的问题是:我可以f:ajax onevent通过f:param(或者可能f:attribute或其他)向我的javascript方法提供一个额外的参数吗?
我们有一个基于JBoss 7.1构建的Web应用程序,包含JSF2和Primefaces 3.3.
在我们的一个页面上,ui:repeat显示了10个项目; 然后用户可以点击某种"显示更多"按钮,并通过ajax显示另外10个项目.用户可以单击"显示更多"按钮,直到没有更多项目显示.注意:这不是分页,每次单击"显示更多"时显示的列表会变长.
实际上,当用户点击按钮时,服务器返回旧项和新项,而JSF的客户端每次都必须通过jQuery重建整个转发器.
我们希望找到更好,更高效的解决方案.旧项目在n-1和n调用之间不会发生变化,因此如果服务器只能通过ajax返回10个新项目,那么效率会更高.
在JSF2中有可能吗?JSF似乎并不真正符合这种递归渲染.唯一可以帮助我们的组件是TreeNode组件,但它看起来有点像黑客: - /
我们在Android(Jellybean和更高版本)下,我们有一个应用程序需要使用OAuth2与Google进行身份验证.
我简化了登录活动,但它看起来像这样:
AccountManager mAccountManager;
// [...]
Account account = new Account("myEmail@gmail.com", "com.google");
// same with professional email managed by Google as myEmail@myDomain.com
// real code recovers accounts with mAccountManager.getAccountsByType("com.google")
mAccountManager = AccountManager.get(getBaseContext());
mAccountManager.getAuthToken(account, "oauth2:https://www.googleapis.com/auth/userinfo.email", null, MyActivity.this, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> accountManagerFuture) {
try {
String token = accountManagerFuture.getResult().getString(AccountManager.KEY_AUTHTOKEN);
// exception occurs here
// [...]
} catch (Exception e) {
Log.e("account", "exception occurs", e);
}
}
}, null);
Run Code Online (Sandbox Code Playgroud)
当我们调用时accountManagerFuture.getResult(),会触发此异常:
android.accounts.AuthenticatorException: UNREGISTERED_ON_API_CONSOLE
at android.accounts.AccountManager.convertErrorToException(AccountManager.java:2024)
at android.accounts.AccountManager.access$400(AccountManager.java:144)
at …Run Code Online (Sandbox Code Playgroud) 在我们的JBoss 7.1.1上的JSF2项目中,我们定义了一个会话超时web.xml,它工作得很好.
但是,有时候我们会看到视图过期,导致像这样的错误,即使会话仍然存在:
javax.faces.application.ViewExpiredException: viewId:/... - View /... could
not be restored.
Run Code Online (Sandbox Code Playgroud)
我们在哪里可以设置视图超时,就像我们为会话所做的那样?或者视图是否由其他内容引起?
在我们的J2EE应用程序中,我们使用EJB-3有状态bean来允许前端代码创建,修改和保存持久性实体(通过JPA-2管理).
它看起来像这样:
@LocalBean
@Stateful
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyEntityController implements Serializable
{
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;
private MyEntity current;
public void create()
{
this.current = new MyEntity();
em.persist(this.current);
}
public void load(Long id)
{
this.current = em.find(MyEntity.class, id);
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void save()
{
em.flush();
}
}
Run Code Online (Sandbox Code Playgroud)
非常重要的是,为了避免过早提交,只有save()方法在一个事务中,所以如果我们调用create(),我们不会在数据库中插入任何内容.
奇怪的是,在该save()方法中,我们必须调用em.flush()才能真正命中数据库.事实上,我试过并发现我们也可以打电话em.isOpen()或者em.getFlushMode()说"与em相关".
我不明白这一点.就像save()在事务中一样,我认为在方法结束时,事务将被提交,因此持久性实体管理器会自动刷新.为什么我必须手动冲洗它?
谢谢,泽维尔
在Solr(3.3)中,是否可以通过字母逐字母搜索EdgeNGramFilterFactory并且对短语查询敏感?
例如,我正在寻找一个字段,如果包含"contrat informatique",将在用户输入时找到:
目前,我做了这样的事情:
<fieldtype name="terms" class="solr.TextField">
<analyzer type="index">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
</analyzer>
</fieldtype>
Run Code Online (Sandbox Code Playgroud)
...但是短语查询失败了.
当我在solr admin中查看模式分析器时,我发现"contrat informatique"生成了以下标记:
[...] contr contra contrat in inf info infor inform [...]
Run Code Online (Sandbox Code Playgroud)
因此查询使用"contrat in"(连续令牌),但不使用"contrat inf"(因为这两个令牌是分开的).
我很确定任何类型的词干都可以用短语查询,但我找不到正确的过滤器标记器来使用之前EdgeNGramFilterFactory.
我们试图将JSF 2.2中的<f:view contracts="xxx" />功能与许多同时合同一起使用,称为"contract1,contract2".
在我们的contract1中,我们有一个文件style1.css,在我们的contract2中,a style2.css.我们通过<h:outputStylesheet />标签在视图中包含两者.
如果我只contracts="contract1"在视图中使用,JSF日志比style2.css缺少,这是合乎逻辑的.
如果我使用contracts="contract1,contract2",JSF导入两个style1.css和style2.css,但有一个错误的URL(它使用&con=contract1而不是&con=contract2获取资源).
这是一个错误吗?这是正常的吗?我找不到任何关于使用许多同时合同的文件.
在我们 在JBoss 7.1.1上的JavaEE6项目(EJB3,JSF2)中,似乎我们有SeamFaces的内存泄漏.@ViewScoped
我们制作了一个小原型来检查这个事实:
在测试结束时,我们使用VisualVM检查内存的内容,这里我们得到了:
@ViewScopedbean,我们仍然可以获得200个有状态实例MyController- 并且该@PreDestroy方法永远不会被调用;@ConversationScopedbean,@preDestroy方法称为会话结束,然后我们得到一个干净的内存.我们是否严重使用视图范围,还是真的是一个错误?
这是XHTML页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html 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:s="http://jboss.org/seam/faces">
<f:metadata>
<f:viewParam name="u" value="#{myBean.uselessParam}" />
<s:viewAction action="#{myBean.callService}" />
</f:metadata>
<h:body >
<f:view>
</f:view>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
现在包含的bean myBean.对于@ConversationScoped变体,所有注释的部分都是未注释的.
@ViewScoped
// @ConversationScoped
@Named
public class MyBean implements Serializable
{
@Inject
MyController myController; …Run Code Online (Sandbox Code Playgroud) 在我们的 WildFly 18 服务器上一段时间后,在生产中,我们遇到了这个错误:
[org.xnio.listener] (default I/O-1) XNIO001007: A channel event listener threw an exception:
java.lang.OutOfMemoryError: Direct buffer memory
at java.base/java.nio.Bits.reserveMemory(Bits.java:175)
at java.base/java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:118)
at java.base/java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:317)
at org.jboss.xnio@3.7.3.Final//org.xnio.BufferAllocator$2.allocate(BufferAllocator.java:57)
at org.jboss.xnio@3.7.3.Final//org.xnio.BufferAllocator$2.allocate(BufferAllocator.java:55)
at org.jboss.xnio@3.7.3.Final//org.xnio.ByteBufferSlicePool.allocateSlices(ByteBufferSlicePool.java:162)
at org.jboss.xnio@3.7.3.Final//org.xnio.ByteBufferSlicePool.allocate(ByteBufferSlicePool.java:149)
at io.undertow.core@2.0.27.Final//io.undertow.server.XnioByteBufferPool.allocate(XnioByteBufferPool.java:53)
at io.undertow.core@2.0.27.Final//io.undertow.server.protocol.framed.AbstractFramedChannel.allocateReferenceCountedBuffer(AbstractFramedChannel.java:549)
at io.undertow.core@2.0.27.Final//io.undertow.server.protocol.framed.AbstractFramedChannel.receive(AbstractFramedChannel.java:370)
at io.undertow.core@2.0.27.Final//io.undertow.websockets.core.AbstractReceiveListener.handleEvent(AbstractReceiveListener.java:38)
at io.undertow.core@2.0.27.Final//io.undertow.websockets.core.AbstractReceiveListener.handleEvent(AbstractReceiveListener.java:33)
at org.jboss.xnio@3.7.3.Final//org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
at io.undertow.core@2.0.27.Final//io.undertow.server.protocol.framed.AbstractFramedChannel$FrameReadListener.handleEvent(AbstractFramedChannel.java:950)
at io.undertow.core@2.0.27.Final//io.undertow.server.protocol.framed.AbstractFramedChannel$FrameReadListener.handleEvent(AbstractFramedChannel.java:931)
at org.jboss.xnio@3.7.3.Final//org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
at org.jboss.xnio@3.7.3.Final//org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.readReady(ReadReadyHandler.java:66)
at org.jboss.xnio.nio@3.7.3.Final//org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:89)
at org.jboss.xnio.nio@3.7.3.Final//org.xnio.nio.WorkerThread.run(WorkerThread.java:591)
Run Code Online (Sandbox Code Playgroud)
我们通过 jxray 检查了 JVM 转储,看来 websockets 是罪魁祸首:
事实上,我们的 websocket 有点简单:
@ApplicationScoped
@ServerEndpoint(value = "/ws/messenger/{accountId}")
public class MessengerSocket implements Serializable
{
private static final …Run Code Online (Sandbox Code Playgroud) 我们正在使用solr 3.6复制和2台服务器 - 主服务器和从服务器 - 我们目前正在寻找干净备份的方法.
正如维基所说的那样,我们可以使用HTTP命令来创建主服务器的快照,如下所示:http://myMasterHost/solr/replication?command=backup
但我们仍然有一些问题:
backup复制索引文件的经典shell脚本上的命令有什么好处?
该命令仅备份索引; 是否可以复制spellchecker文件夹?它需要吗?
我们可以在应用程序运行时创建快照,所以虽然有潜在的索引更新吗?
replication.properties文件(或不删除)?http://mySlave/solr/replication?command=fetchindex?jsf-2 ×4
java ×3
jsf ×2
solr ×2
ajax ×1
android ×1
backup ×1
cdi ×1
ejb ×1
flush ×1
google-api ×1
javascript ×1
jpa ×1
jquery ×1
jsf-2.2 ×1
memory-leaks ×1
oauth-2.0 ×1
persistence ×1
phrase ×1
primefaces ×1
replication ×1
seam3 ×1
session ×1
timeout ×1
tokenize ×1
undertow ×1
view ×1
view-scope ×1
websocket ×1
wildfly ×1