更新到Mojarra 2.2.6时出现奇怪的启动错误

19

我已经将Mojarra 2.2.5更新为2.2.6,运行在Tomcat 7.0.42 + jdk1.6.0_27系统上,在启动时我遇到了以下错误(即使应用程序能够正常启动和运行):

SEVERE: Unable to find the encoded key.
javax.naming.NameNotFoundException: Name [jsf/ClientSideSecretKey] is not bound in this Context. Unable to find [jsf].
    at org.apache.naming.NamingContext.lookup(NamingContext.java:820)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:831)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:831)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:168)
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:158)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at com.sun.faces.renderkit.ByteArrayGuard.setupKeyAndMac(ByteArrayGuard.java:214)
    at com.sun.faces.renderkit.ByteArrayGuard.<init>(ByteArrayGuard.java:89)
    at com.sun.faces.renderkit.ClientSideStateHelper.init(ClientSideStateHelper.java:476)
    at com.sun.faces.renderkit.ClientSideStateHelper.<init>(ClientSideStateHelper.java:150)
    at com.sun.faces.renderkit.ResponseStateManagerImpl.<init>(ResponseStateManagerImpl.java:68)
    at com.sun.faces.renderkit.RenderKitImpl.<init>(RenderKitImpl.java:121)
    at com.sun.faces.renderkit.RenderKitFactoryImpl.<init>(RenderKitFactoryImpl.java:79)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:355)
    at java.lang.Class.newInstance(Class.java:308)
    at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:721)
    at javax.faces.FactoryFinder.getImplementationInstance(FactoryFinder.java:553)
    at javax.faces.FactoryFinder.access$500(FactoryFinder.java:140)
    at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:1120)
    at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:379)
    at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:328)
    at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:236)
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:435)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:214)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4937)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
SecretKey: 31chBtWqlcPEsnTy/BVEOA==Mar 31, 2014 7:20:48 PM com.sun.faces.config.ConfigureListener$WebConfigResourceMonitor$Monitor <init>

有什么建议吗? 谢谢。

1个回答

21

我也遇到了相同的情况。显然,如果将视图状态保存方式配置为"client",则隐藏的视图状态将被加密,用于加密的密钥可以使用"jsf/ClientSideSecretKey"环境变量进行提供(可选)。通过反复试验,我发现密钥必须是Base64编码的。

在将此添加到我的web.xml文件之后...

<env-entry>
   <env-entry-name>jsf/ClientSideSecretKey</env-entry-name>
   <env-entry-type>java.lang.String</env-entry-type>
   <env-entry-value>am9kZXRlcHV0b2hhY2tlcg==</env-entry-value>
</env-entry>  

错误已经消失。

我真正想知道的是......这个功能在哪里有记录?我唯一能找到的信息在这里:https://java.net/jira/browse/JAVASERVERFACES-3083


1
这对我有用,但是一开始我遇到了 InvalidKeyException: Invalid AES key length: 50 bytes 的问题。最终发现密钥只能是8、16或32个字节长(在BASE64编码之前)。然后我将其更改为32,但却得到了异常 InvalidKeyException: Illegal key size。原来要使用32字节长的密钥,需要Java密码扩展程序,可以在此处下载:链接 - Bjørn Stenfeldt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接