Предупреждение от XStream, не удается найти itemFieldName в XStreamImplicit

Я пытаюсь отследить источник предупреждения:

warning: Cannot find annotation method 'itemFieldName()' in type 'com.thoughtworks.xstream.annotations.XStreamImplicit'

Соответствующий код:

@XStreamAlias("things")
@XStreamImplicit(itemFieldName = "things")
private List<Thing> things;

Глядя на XStream JAR, я вижу:

@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD})
public static @interface XStreamImplicit {

    java.lang.String itemFieldName() default "";
}

Так что я не совсем уверен, почему я получаю предупреждение. Похоже, это не вызывает проблем, но я получаю их кучу в своем выводе компилятора, и я хотел бы их убрать.

Изменить: еще немного покопался и нашел это: http://java.dzone.com/articles/when-good-annotations-go-bad посмотрите комментарий от «Фабрицио»

Хм .... может быть, я слишком тороплюсь и плохо понял ... но, насколько я знаю, когда вы скомпилировали класс C1, который аннотирован A, вы можете поместить C1 в компиляцию (и запустить) classpath для C2 без необходимости помещать A в classpath C2. Вы получаете только предупреждения, а A игнорируется (как и положено: аннотации имеют значение только в определенном контексте, а в контексте C2 A бессмысленно).

Я только что дважды проверил, скомпилировав образец класса X против JAR, который содержит аннотации javax.persistence (но не помещая jpa.jar в путь к классам компилятора):

istral:/tmp> javac -classpath it-tidalwave-catalog.jar X.java it/tidalwave/catalog/persistence/CategoryPB.class(it/tidalwave/catalog/persistence:CategoryPB.class): предупреждение: не удается найти метод аннотации ' name()» в типе «javax.persistence.Table»: файл класса для javax.persistence.Table не найден/tidalwave/catalog/persistence/CategoryPB.class(it/tidalwave/catalog/persistence:CategoryPB.class): предупреждение : Не удается найти метод аннотации «length()» в типе «javax.persistence.Column»: файл класса для javax.persistence.Column не найден/tidalwave/catalog/persistence/CategoryPB.class(it/tidalwave/catalog/persistence: CategoryPB.class): предупреждение: не удается найти метод аннотации 'name()' в типе 'javax.persistence.Column'

и т.д... Просто предупреждения, компиляция прошла успешно.

Поэтому я думаю, что это просто проблема аннотации/класса.


person Freiheit    schedule 30.06.2010    source источник


Ответы (1)


Я не совсем знаком с XStream — выглядит довольно изящно — но исходя из характера используемых вами аннотаций (и руководство по аннотациям), я думаю, что у вас слишком много аннотаций на вашем things. Судя по моему беглому обзору, аннотация псевдонима преобразует полные имена объектов в более подходящие имена элементов XML (имена объектов используются по умолчанию). Неявные коллекции будут работать без имени поля, просто используя имя класса типа контента коллекции. Если вы хотите, чтобы элементы коллекции в XML имели другое имя, тогда вы используете свойство itemFieldName.

Я рекомендую попробовать тот же код, просто удалив аннотацию @XStreamAlias из things, и посмотреть, исправит ли это проблему. Кроме того, если это сработает, я думаю, вы можете изменить значение в itemFieldName, потому что в его нынешнем виде у вас будет коллекция элементов с именем things — я думаю, что использование вместо этого thing может работать лучше.

Надеюсь это поможет!

person mlschechter    schedule 01.07.2010
comment
Я вижу, куда ты идешь. Вы правы, использование обеих аннотаций не требуется. xstream.codehaus.org/annotations-tutorial.html Я написал тест и доказал его слишком. Однако предупреждения компилятора не изменились. - person Freiheit; 01.07.2010