Использование интерфейсов предикатов и функций Guava 10 с GWT 2.4.0

Поддерживаются ли Predicates и Functions в GWT 2.4.0 и Guava GWT 10.0.1? Оба интерфейса помечены как @GwtCompatible.

При запуске проекта в режиме хоста отладки я получаю ошибки проверки времени выполнения при использовании Predicate:

[ОШИБКА] [MyProject] - Строка XXY: импорт javax.annotation.Nullable не может быть разрешен

[ОШИБКА] [MyProject] - Строка YYY: значение Nullable не может быть преобразовано в тип

Судя по другим сообщениям StackOverflow, я считаю, что эти ошибки не должны требовать включения JSR 305 в путь, начиная с версии Guava 09 (в любом случае включение JSR 305 в путь не устранило проблему).

Я также, кажется, получаю пару ошибок несоответствия интерфейса:

[ОШИБКА] [MyProject] - Строка XXX: тип new Function () {} должен реализовывать унаследованный абстрактный метод Function.apply (Object)

[ОШИБКА] [MyProject] - Строка YYY: метод apply (MyType) типа new Function () {} должен переопределять или реализовывать метод супертипа.

и аналогичные ошибки при использовании Predicate, которые я представил как ошибку: http://code.google.com/p/guava-libraries/issues/detail?id=765

Есть идеи относительно того, что может быть не так с моей настройкой?

Мой файл Project .gwt.xml содержит следующие строки:

<inherits name="com.google.common.collect.Collect" />
<inherits name="com.google.common.base.Base" />

Мой файл java включает в себя следующие операции импорта:

import com.google.common.base.Function;
import com.google.common.base.Predicate;

Я использую Eclipse 3.7.1 и JavaSE-1.6


person Todd Schiller    schedule 19.10.2011    source источник
comment
Какой JAR вы включаете в свой проект webapp? guava-10.0.1.jar или guava-gwt-10.0.1.jar?   -  person Strelok    schedule 20.10.2011
comment
@Strelok: оба находятся в war / WEB-INF / lib и в пути сборки проекта (как не внешние JAR)   -  person Todd Schiller    schedule 21.10.2011
comment
Функция и предикат используются в преобразованиях и фильтрах. Проверьте этот импорт. У меня была проблема с несовпадающими методами, потому что Transform исходил откуда-то ненадежно, а не из google.common.   -  person Steve J    schedule 27.10.2011


Ответы (2)


У меня была такая же проблема, и я нашел решение. Проблема в том, что исходный код JSR 305 не является частью модуля GWT и поэтому игнорируется GWT. Чтобы исправить это, сделайте следующее:

  • Добавьте дескриптор модуля GWT в jsr305-2.0.0.jar. Внутри jar-файла, который должен содержать хотя бы исходники java в подпапке javax/annotation, добавьте файл Annotation.gwt.xml со следующим содержимым:
<?xml version="1.0" encoding="UTF-8"?>
<module>
    <source path="" />
</module>
  • Добавьте измененный jsr305-2.0.0.jar в путь к классам вашего проекта GWT в eclipse. Хотя в другом месте указано, не требуется добавлять эту банку в WEB-INF/lib

  • Позвольте модулям вашего проекта наследовать только что созданный модуль GWT, добавив следующую строку в .gwt.xml файлы ваших модулей:

<inherits name='javax.annotation.Annotation'/>

Вот и все! Теперь ваш проект eclipse будет успешно скомпилирован, и режим разработки / размещения тоже будет работать.

person Gandalf    schedule 19.06.2012

Это своего рода известная ошибка, которую необходимо иметь jsr305.jar в вашем WEB-INF / lib, вот и все.

Еще стоит обратить внимание на то, что части гуавы объединены в боковой GWT * .jar, но там они помещены в отдельный пакет com.google.gwt.thirdparty.guava.common ..... И как это часто бывает происходит с eclipse, так как при разрешении импорта он захватывает неправильный импорт, и это вызывает беспорядок во время выполнения, поскольку классы, упакованные в com.google.gwt.thirdparty.guava, относятся к другой версии и НЕ ДОЛЖНЫ использоваться.

Мой совет:

Выполните текстовый поиск во всех своих файлах * .java для подстроки "сторонний" и замените ее правильным импортом - у меня это сработало.

Немного более глубокое объяснение заключается в том, что в предыдущих версиях Guava jsr305 был включен в банку guava, но в этом выпуске они удалили его, и зависимость от него действительно появляется в Maven pom библиотеки, но не была хорошо документирована на веб-сайте. Это вызвало у пользователей большое недоумение.

person Boris Daich    schedule 01.12.2011