Невозможно отобразить изображение с помощью Google App Engine - PullRequest
0 голосов
/ 18 февраля 2012

РЕДАКТИРОВАТЬ: Это начало работать, и я ничего не изменил, это второй раз, когда я столкнулся с этой проблемой, мое приложение работает некоторое время, а затем просто перестает работать внезапно.Является ли GAE ненадежным, когда дело доходит до весны?Кто-нибудь еще испытывал подобные проблемы с GAE?

Я не могу отобразить анимированный GIF-файл на странице JSP.GIF-файл отображается локально, но когда я запускаю на сервере ядра приложений, выдается ошибка.Вот мои настройки:

Я добавил каталог изображений в appengine-web.xml:

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

Структура моего проекта:

enter image description here

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

Но я получаю сообщение об ошибке:

enter image description here

A java.lang.NoSuchMethodError:выбрасывается в консоль администратора, но я не вижу, как это может быть связано с загрузкой изображения 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)

Внешние библиотеки: enter image description here

Ответы [ 5 ]

3 голосов
/ 20 февраля 2012

NoSuchMethodError почти всегда вызывается из-за использования несовместимых версий библиотек. В этом случае вы, вероятно, используете другую версию библиотек Spring. Например, spring-web-3.1.0.jar и spring-context-3.0.x.jar . Поэтому попробуйте обновить все банки Spring до последней версии.

Если вы сообщите нам, какие версии вы используете, возможно, мы сможем вам помочь больше.

РЕДАКТИРОВАТЬ: Зависимости Spring в pom.xml

<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>

EDIT:

Хорошо, что это NoSuchMethodError сообщает нам, что ваше приложение выполняет StandardServletEnvironment , которое считает , что JndiLocatorDelegate имеет метод с именем isDefaultJndiEnvironmentAvailable () , но метод не существует, когда его фактически вызывает. Но этот метод существует в org.springframewor.context-3.1.1.jar , как вы можете увидеть здесь (версия 3.1.0) .

Итак, проблема может заключаться в нескольких вещах:

  • В пути к классам имеется более одного JndiLocatorDelegate . Это возможно, если вы используете другую библиотеку как metrics.collector . В Eclipse вы можете нажать Ctrl + Shift + T и набрать JndiLocatorDelegate , чтобы быть уверенным, что в проекте найден ТОЛЬКО ОДИН ОДИН названный класс, подобный этому, и посмотреть, содержит ли этот класс isDefaultJndiEnvironmentAvailable () метод.

  • По какой-то странной причине вы не выполняете свой текущий код. Попробуйте очистить проект, временные папки и рабочий каталог Tomcat.

Если это вам не поможет, пожалуйста, дайте нам список всех банок, включенных в вашу войну.

1 голос
/ 21 февраля 2012

Чтобы увидеть причину этой ошибки (это может быть проблема GAE или Spring)

попробуйте работать с версией Spring, которая на 100% совместима с GAE, посмотрите здесь в списке

WillItPlayInJava

и выберите версию Spring, которая наверняка работает с GAE ... может быть, эта версия, с которой вы пытаетесь работать, не будет работать в данный момент с GAE (нет без специальных настроек)

также, посмотрите здесь: Могу ли я использовать Spring на GAE? для дополнительной информации ..,

0 голосов
/ 26 февраля 2012

Поскольку HTML-код обслуживается отдельно (вызывая сервлет), попробуйте удалить его как фактор, перейдя непосредственно к изображению (используя URL-адрес изображения). Что тогда появляется в логах?

Единственное, что мне кажется подозрительным, это элемент include. Я использую

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

форма, столкнувшись с какой-то изворотливой обработкой "**" раньше.

0 голосов
/ 21 февраля 2012

Попробуйте:

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

Эта двойная звездочка в регулярном выражении должна быть закрытием, которое убьет регулярное выражение или заставит его работать вечно.

0 голосов
/ 20 февраля 2012

В вашем HTML-теге:

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

Мне не хватает контекста веб-приложения, необходимого для абсолютных путей в веб-приложениях (если только он не настроен в качестве корневого приложения).

Добавление contextPath "/ foo "(как в http://host:post/foo):

<img src="/foo/images/ajax-loader.gif"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...