Nano Hash - криптовалюты, майнинг, программирование

Пользовательская аннотация Java не отображается

Для своего проекта я конвертирую классы в json с помощью jackson fastxml. Теперь мне нужно изменить в одном месте способ преобразования объектов, чтобы @JsonIgnore игнорировался, а свойство сериализовалось.

Я обнаружил, что могу сделать это, расширив JacksonAnnotationIntrospector и пользовательскую аннотацию. Проблема в том, что пользовательская аннотация видна только в том случае, если она определена в том же пакете/проекте/osgi, что и реализующий класс, в то время как я хотел бы определить ее в пакете службы, который предоставляет преобразование json. Если аннотация находится в пакете реализации, я не могу сослаться на нее в JacksonAnnotationIntrospector, и мне нужно будет проверить имя аннотации.

У меня есть две одинаковые аннотации с разницей только в пакете:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName {

}

Когда я устанавливаю обе реализации, я вижу только аннотацию, определенную из того же пакета/проекта/osgi, что и класс реализации. Есть ли ограничение по этому поводу или кто-нибудь знает, в чем может быть проблема?


  • Хм, у меня есть две одинаковые аннотации... почему бы вам вообще не использовать уникальные имена? 31.07.2017
  • Я добавил 2 в одно из двух определений, чтобы они были уникальными. Я не думаю, что это проблема в JacksonAnnotationIntrospector, потому что независимо от того, где я отлаживаю, я могу найти аннотацию из пакета реализующего класса и не могу найти ее из пакета службы. 31.07.2017
  • Ну, вы импортировали другую аннотацию? Вы пытались сослаться на него с полным именем, включая пакет? 31.07.2017

Ответы:


1

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

В своем пользовательском коде добавьте пакет API к зависимостям maven и используйте новую аннотацию. Плагин maven-bundle-plugin (или то, что вы используете) должен создать оператор Import-Package в вашем манифесте. Это обеспечит возможность подключения аннотации во время выполнения.

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

31.07.2017
  • Я нашел решение, я использовал аннотации подпакета, которые я экспортировал (с API. *), но я импортировал API только с плагином пакета maven. Я попытался переместить аннотацию в пакет API, который заставил ее работать. 31.07.2017
  • @ user1147747 Мораль этой истории: не используйте импорт с *. Всегда импортируйте полное имя класса и имейте полный список явного импорта. 31.07.2017
  • Самая важная часть — позволить плагину maven-bundle-plugin творить чудеса. Обычно он определяет импорт. Так что лучше оставить значения по умолчанию. 31.07.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..