【问题标题】:Unable to display an image using google app engine无法使用谷歌应用引擎显示图像
【发布时间】:2012-03-09 14:11:49
【问题描述】:

编辑:这已经开始工作,我没有改变任何东西,这是我第二次遇到这个问题,我的应用程序工作了一段时间,然后突然停止工作。 谈到 Spring 时,GAE 是否不可靠?有没有其他人遇到过类似的 GAE 问题?

我无法在 jsp 页面上显示动画 gif。 gif 在本地显示,但是当我在应用程序引擎服务器上实时显示时,会引发错误。这是我的设置:

我已经在 appengine-web.xml 中添加了 images 目录:

<static-files> <include path="/images/**.*" /> </static-files>

我的项目结构:

I load the image using html code : `<img src="/images/ajax-loader.gif"/>`

但我收到错误:

一个 java.lang.NoSuchMethodError: 正在管理控制台中抛出,但我看不出这与加载 gif 图像有什么关系? 我使用的 gif 取自 http://www.ajaxload.info/ & 指标类型是“指标”

java.lang.NoSuchMethodError: org.springframework.jndi.JndiLocatorDelegate.isDefaultJndiEnvironmentAvailable()Z
    at org.springframework.web.context.support.StandardServletEnvironment.customizePropertySources(StandardServletEnvironment.java:85)
    at org.springframework.core.env.AbstractEnvironment.<init>(AbstractEnvironment.java:101)
    at org.springframework.core.env.StandardEnvironment.<init>(StandardEnvironment.java:54)
    at org.springframework.web.context.support.StandardServletEnvironment.<init>(StandardServletEnvironment.java:43)
    at org.springframework.web.servlet.HttpServletBean.<init>(HttpServletBean.java:90)
    at org.springframework.web.servlet.FrameworkServlet.<init>(FrameworkServlet.java:211)
    at org.springframework.web.servlet.DispatcherServlet.<init>(DispatcherServlet.java:303)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
    at java.lang.Class.newInstance0(Class.java:372)
    at java.lang.Class.newInstance(Class.java:325)
    at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153)
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:428)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:263)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:202)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:171)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:123)
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:422)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:449)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455)
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:695)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453)
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
    at java.lang.Thread.run(Thread.java:679)

外部库:

【问题讨论】:

  • 你是说如果你用 static gif 替换图像,这个异常不会抛出???
  • @Qwe 无论图片是否为静态,都会抛出异常。
  • 编辑了主题 - 动画 gif 与您遇到的问题无关
  • 您是否在加载包含&lt;img&gt; 标签的页面时或在加载/images/ajax-loader.gif 本身时收到错误消息?如果您直接在浏览器的地址栏中输入http://&lt;hostname&gt;/images/ajax-loader.gif 会发生什么?如果您从提供错误的页面中删除 &lt;img&gt; 标记会怎样?

标签: java html spring google-app-engine


【解决方案1】:

由于 HTML 是单独提供的(通过调用 servlet),请尝试通过直接跟踪图像(使用图像的 URL)来消除它作为一个因素。那么日志中会显示什么?

在我看来唯一可疑的是 include 元素。我用的

<include path="images/*.gif" />

form,之前遇到过一些古怪的“**”处理。

【讨论】:

  • 这是我第一次看到错误时尝试的方法,我总是可以直接导航到图像而不会出现问题。
【解决方案2】:

NoSuchMethodError 几乎总是由于使用不兼容的库版本引起的。在这种情况下,您可能正在使用不同版本的 Spring 库。例如 spring-web-3.1.0.jarspring-context-3.0.x.jar。因此,尝试将所有 Spring jar 更新到最新版本。

如果您告诉我们您使用的是哪个版本,也许我们可以为您提供更多帮助。

编辑: pom.xml 中的 Spring 依赖项

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>3.1.0.RELEASE</version>
    </dependency>
...
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>3.1.0.RELEASE</version>
    </dependency>
</dependencies>

编辑:

嗯,这个 NoSuchMethodError 告诉我们的是您的应用程序正在执行 相信 JndiLocatorDelegateStandardServletEnvironment有一个名为 isDefaultJndiEnvironmentAvailable() 的方法,但实际调用时该方法并不存在。但是这个方法存在于org.springframewor.context-3.1.1.jar中,可以看到here (version 3.1.0)

所以,问题可能是几件事:

  • 类路径中有多个 JndiLocatorDelegate。如果您使用另一个库作为metrics.collector,这是可能的。在 Eclipse 中,您可以按 Ctrl+Shift+T 并键入 JndiLocatorDelegate 以确保在项目中只找到一个这样命名的类,并查看该类是否包含 isDefaultJndiEnvironmentAvailable() 方法。

  • 由于某种奇怪的原因,您没有执行当前代码。尝试清理您的项目、临时文件夹和 Tomcat 工作目录。

如果这对您没有帮助,请给我们一份包含在您的战争中的所有 jar 的列表。

【讨论】:

  • 请查看我的问题编辑,我已更新到最新的 Spring jar。我已经发布了我使用的罐子
  • @user470184:我无法通过 Maven 获得 Spring 3.1.1。我检查了从 Maven Central Repository 下载的 3.1.0 jars,这个错误是绝对不可能的。您可以尝试使用 3.1.0 版本或向我们展示您的完整 pom.xml 吗?
  • 我已尝试从 springsource.org/download/… 发布版本 3.1.0,但同样的错误仍然存​​在。我目前没有使用 maven
  • 我会将我的项目转换为使用 maven,你能发布使用 spring 依赖项的 pom 文件吗?
  • 是的,我尝试使用 maven 并重新创建项目。
【解决方案3】:

试试:

<static-files> <include path="/images/*.*" /> </static-files>

正则表达式中的双星号应该是一个闭包,它将杀死正则表达式或使其永远运行。

【讨论】:

    【解决方案4】:

    为了查看导致此错误的原因(可能是 GAE 或 Spring 问题)

    尝试使用与 GAE 100% 兼容的 Spring 版本,在列表中查看此处

    WillItPlayInJava

    并选择一个可以与 GAE 一起使用的 Spring 版本... 因为也许您尝试使用的那个版本目前无法与 GAE 一起使用(没有特殊的 tweks)

    另外,请看这里:Can i use Spring on GAE? 了解更多信息..,

    【讨论】:

    • 我不相信 WillItPlayInJava 是最新的,因为问题是:“:我可以在 GAE 上使用 Spring 吗?”详细介绍了用户如何在 spring 3 中成功使用 GAE。WillItPlayInJava 也受版权保护“2011”,因此可能不是最新的。
    • 我提出这个只是为了安全起见......并帮助找出错误的原因
    【解决方案5】:

    在你的 html 标签上:

    <img src="/images/ajax-loader.gif"/>
    

    我错过了 web 应用程序上下文,这是 web 应用程序上的绝对路径所需的(除非它被配置为根应用程序)。

    假设 contextPath "/foo"(如http://host:post/foo):

    <img src="/foo/images/ajax-loader.gif"/>
    

    【讨论】:

    • 我认为这不会产生异常
    • 我试过 但同样的错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    相关资源
    最近更新 更多