【问题标题】:Error trying to use a4j:mediaOutput on JBoss EAP 6.4在 JBoss EAP 6.4 上尝试使用 a4j:mediaOutput 时出错
【发布时间】:2018-08-31 20:00:36
【问题描述】:

我正在尝试在我的应用程序中渲染图片。我选择了 a4j:mediaOutput 来渲染它。我使用 jboss doc link 中的示例,它显示错误:

11:49:53,716 SEVERE [org.richfaces.log.Resource] (http-localhost/127.0.0.1:9080-25) 反序列化数据的输入错误:java.io.InvalidClassException:未经授权的反序列化尝试; simple.MediaData 在 org.richfaces.util.LookAheadObjectInputStream.resolveClass(LookAheadObjectInputStream.java:100) [richfaces-core-4.5.17.Final.jar:4.5.17.Final] 在 java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1695) [rt.jar:1.8.0] 在 java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1600) [rt.jar:1.8.0] 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1875) [rt.jar:1.8.0] 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1432) [rt.jar:1.8.0] 在 java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2094) [rt.jar:1.8.0] 在 java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2019) [rt.jar:1.8.0] 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1902) [rt.jar:1.8.0] 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1432) [rt.jar:1.8.0] 在 java.io.ObjectInputStream.readArray(ObjectInputStream.java:1789) [rt.jar:1.8.0] 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1426) [rt.jar:1.8.0] 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:428) [rt.jar:1.8.0] 在 org.richfaces.resource.ResourceUtils.decodeObjectData(ResourceUtils.java:247) [richfaces-core-4.5.17.Final.jar:4.5.17.Final] 在 org.richfaces.resource.DefaultCodecResourceRequestData.getData(DefaultCodecResourceRequestData.java:96) [richfaces-core-4.5.17.Final.jar:4.5.17.Final] 在 org.richfaces.resource.ResourceFactoryImpl.createResource(ResourceFactoryImpl.java:325) [richfaces-core-4.5.17.Final.jar:4.5.17.Final] 在 org.richfaces.resource.ResourceHandlerImpl.handleResourceRequest(ResourceHandlerImpl.java:111) [richfaces-core-4.5.17.Final.jar:4.5.17.Final] 在 javax.faces.webapp.FacesServlet.service(FacesServlet.java:591) [jboss-jsf-api_2.1_spec-2.1.28.Final-redhat-1.jar:2.1.28.Final-redhat-1] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:231) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21] 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:150) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:400) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.java:355) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:911) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.tomcat.util.net.NioEndpoint$ChannelProcessor.run(NioEndpoint.java:936) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1153) [rt.jar:1.8.0] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [rt.jar:1.8.0] 在 org.apache.tomcat.util.net.NioEndpoint$DefaultThreadFactory$1$1.run(NioEndpoint.java:1249) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 java.lang.Thread.run(Thread.java:785) [vm.jar:1.8.0]

11:49:53,724 错误 [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/outputmediaTest].[Faces Servlet]] (http-localhost/127.0.0.1:9080-25) JBWEB000236: Servlet Faces Servlet 的 Servlet.service() 抛出异常: java.lang.NullPointerException 在 org.richfaces.resource.MediaOutputResource.encode(MediaOutputResource.java:65) [richfaces-a4j-4.5.17.Final.jar:4.5.17.Final] 在 org.richfaces.resource.UserResourceWrapperImpl.encode(UserResourceWrapperImpl.java:187) [richfaces-core-4.5.17.Final.jar:4.5.17.Final] 在 org.richfaces.resource.ResourceHandlerImpl.handleResourceRequest(ResourceHandlerImpl.java:184) [richfaces-core-4.5.17.Final.jar:4.5.17.Final] 在 javax.faces.webapp.FacesServlet.service(FacesServlet.java:591) [jboss-jsf-api_2.1_spec-2.1.28.Final-redhat-1.jar:2.1.28.Final-redhat-1] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:231) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21] 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:150) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:400) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.java:355) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:911) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.tomcat.util.net.NioEndpoint$ChannelProcessor.run(NioEndpoint.java:936) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1153) [rt.jar:1.8.0] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [rt.jar:1.8.0] 在 org.apache.tomcat.util.net.NioEndpoint$DefaultThreadFactory$1$1.run(NioEndpoint.java:1249) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 java.lang.Thread.run(Thread.java:785) [vm.jar:1.8.0]

当我将 MediaData 更改为实现 org.richfaces.resource.SerializableResource 而不是 Serializable 时,它​​开始说 awt.Color 无法序列化。

要清楚,我的 xhtml 文件是:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:f="http://java.sun.com/jsf/core"
            xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:a4j="http://richfaces.org/a4j">
<h:form id="form">
<h1>TEST</h1>
<a4j:mediaOutput element="img" cacheable="false" id="img" createContent="#{mediaBean.paint}"
        value="#{mediaData}" mimeType="image/jpeg" />
</h:form>

我的 POM.xml 是:

<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.leandrolima</groupId>
<artifactId>outputmediaTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>outputmediaTest</name>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.jboss.spec/jboss-javaee-6.0 -->
    <dependency>
        <groupId>org.jboss.spec</groupId>
        <artifactId>jboss-javaee-6.0</artifactId>
        <version>3.0.3.Final</version>
        <type>pom</type>
        <scope>provided</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.richfaces/richfaces-core -->
    <dependency>
        <groupId>org.richfaces</groupId>
        <artifactId>richfaces-core</artifactId>
        <version>4.5.17.Final</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.richfaces/richfaces -->
    <dependency>
        <groupId>org.richfaces</groupId>
        <artifactId>richfaces</artifactId>
        <version>4.5.17.Final</version>
    </dependency>



</dependencies>

我正在使用 JBoss EAP 6.4,还尝试使用 Tomcat 8.0 和 jsf impl:

        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-impl</artifactId>
            <version>2.2.10</version>
        </dependency>

错误是一样的。

【问题讨论】:

  • 根据堆栈跟踪,“createContent”为空,这很奇怪。您是否尝试过运行展示柜?
  • 你是说这个showcase.richfaces.org/richfaces/… 吗?他们使用 mediaReader 并且不显示代码。
  • 我尝试使用此页面中的代码 programcreek.com/java-api-examples/… 进行展示,但错误是相同的。我会编辑帖子说出来。
  • 我不是指复制代码,我是指在本地部署展示柜,如果它不起作用,那么它可能与您的服务器有关。你到底在运行什么服务器?
  • 我正在使用 JBoss EAP 6.4,并尝试使用 Tomcat 和 oracle 的 jsf 实现。

标签: jsf richfaces jboss6.x jboss-eap-6


【解决方案1】:

第一个例外是相当重要的。

@value 必须是基本数据类型或实现 white-listed classes 之一

【讨论】:

  • 嗨,Makhiel 我知道。感谢您的回答,但我在问题中也说过我已经尝试实现 SerializableResource 并且它开始说 awt.Date 不可序列化。
  • 错误信息是什么?我在使用 java.awt.Color 时看到的和上面的一样。
  • 完全一样。问题是官方的例子是错误的。
  • 您还可以通过创建自己的 resource-serialization.properties 文件将类添加到白名单。但我不建议这样做,因为它会增加安全漏洞的可能性:codewhitesec.blogspot.com/2018/05/poor-richfaces.html
【解决方案2】:

正如 Makhiel 所说,我发现让 mediaData 实现 SerializableResource 可以解决第一个错误。通过一些解决方法,它可以工作并显示图像。

为了帮助其他人尝试查看该组件的工作,由于官方展示似乎无法正常工作,下面举一个简单的例子。只需使用 MediaBean:

package simple;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.imageio.ImageIO;

@ManagedBean(name = "imageBean")
@RequestScoped
public class MediaBean {
    private static final String RICHFACES_MEDIA_OUTPUT_IMAGE_SOURCE = "/images/image.jpg";

    public void paint(final OutputStream out, final Object data) throws IOException {
        if (data == null) {
            return;
        }

        final byte[] imageData = getImage(Integer.parseInt((String) data));

        final InputStream in = new ByteArrayInputStream(imageData);
        try {
            final BufferedImage bImageFromConvert = ImageIO.read(in);
            ImageIO.write(bImageFromConvert, "png", out);
        }
        finally {
            in.close();
        }
    }

    private byte[] getImage(final int data) throws IOException {
        final ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext();
        final String resource = extContext.getResource(RICHFACES_MEDIA_OUTPUT_IMAGE_SOURCE).getFile();
        final BufferedImage bImage = ImageIO.read(new File(resource));
        final ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ImageIO.write(bImage, "jpg", bos);
        return bos.toByteArray();
    }
}

和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:rich="http://richfaces.org/rich"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:h="http://java.sun.com/jsf/html">

<h:head>
</h:head>
<body>
    <h1>TEST</h1>
    <rich:panel>
        <a4j:mediaOutput element="img" cacheable="false" session="false"
            createContent="#{imageBean.paint}" value="0" mimeType="image/jpeg" />
    </rich:panel>
</body>
</html>

/images/image.jpg 放在 webapp 文件夹中应该会显示该图像。

尽管如此,我还是会在我的工作环境中收到第二条错误消息。

研究一下,我发现在我在 Tomcat 上创建的用于测试的迷你项目中,我使用了 JSF 2.2.10,而在我的工作环境中,我使用的是 JBoss EAP 6.4 JSF 2.0.3-b05 附带的。在这两个版本中,我都使用 RichFaces 4.5.17.Final,显然,该版本与 JSF 2.0.3-b05 不兼容。

尝试使用该版本时收到错误消息:

org.apache.catalina.core.StandardContext listenerStart GRAVE: 向监听器实例发送上下文初始化事件的异常 类 [com.sun.faces.config.ConfigureListener] com.sun.faces.config.ConfigurationException:配置失败!这 JSF implementation 2.0.3- 不支持 RichFaces 扩展部分视图上下文。请至少升级到 Mojarra 2.1.28 或 2.2.6

当我们开始从 JBoss 6.1 迁移到 6.4 并更改 RichFaces 版本时,问题就开始了。所以我认为这是问题的原因,可能的解决方案是升级 JSF 版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 2016-09-10
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    相关资源
    最近更新 更多