Пользовательская аннотация Java для ограниченного доступа к методу - PullRequest
1 голос
/ 14 июля 2011

Я строю приложение на два слоя. Веб-уровень и бизнес-уровень.

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

Я хочу, чтобы только некоторые из этих методов вызывались из веб-слоя (безопасный).

Мне было интересно, могу ли я создать аннотацию на своем бизнес-уровне, например, @Public, что означает, что я могу вызывать этот метод из веб-слоя, и @Private, поэтому я не должен использовать этот метод из веб-слоя.

А когда я пытаюсь вызвать метод @private из веб-слоя (в затмении), он выдает мне предупреждение?

Также: могу ли я иметь возможность автоматически перечислять все эти методы как частные, так и публичные?

Ответы [ 3 ]

0 голосов
/ 14 июля 2011

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

У нас есть @Override аннотация для методов.Эта аннотация используется по аналогичной причине: проверьте во время компиляции, что определенные условия выполнены.В этом случае: аннотированные методы переопределяют метод из суперкласса или реализуют интерфейсный метод или абстрактный метод.Если верификатор обнаружит, что это не так, то компилятор выдаст ошибку времени компиляции.

Так что это должно быть возможно и здесь.Мы могли бы подумать о аннотациях типа

 @Layer("servicelayer")                // class annotation

 @Private(layer="servicelayer")        // method annotation

И теперь мы можем проверить во время компиляции, что аннотированные методы могут вызываться только из классов, имеющих одинаковую аннотацию слоя.Если условие не выполняется, компилятор может выдать предупреждение (iaw: компилятор может обнаружить, если мы случайно вызовем метод внутреннего уровня сервиса из класса веб-слоя.

0 голосов
/ 14 июля 2011

AFAIK, вы не можете заставить Eclipse использовать аннотацию, чтобы определить, можете ли вы получить доступ к методу из определенного файла.Чтобы это было возможно, Eclipse должен знать, является ли файл частью веб-уровня или бизнес-уровня.

Чтобы перечислить все методы, имеющие определенную аннотацию, вы можете использовать отражение во время выполнения.В Eclipse могут быть фильтры, но я не знаю ни одного фильтра на основе аннотаций.

Может быть, вам следует выбрать другой подход, я кратко опишу, как мы это делаем:

У нас естьдва интерфейса, которые могут реализовывать наши сервисы:

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

Мы разделили эти интерфейсы на два проекта eclipse - один общедоступный проект API и один проект внедрения, содержащий сервисы и внутренний API - и просто разрешили доступ к общедоступному проекту API с веб-уровня.

Поскольку нашим службам (EJB 3.0) нужен интерфейс, мы должны добавить внутренний, если у нас есть внутренние методы.Однако с другой технологией (например, EJB 3.1) вы также можете просто предоставить открытый интерфейс.

Другой подход может состоять в том, чтобы разделить интерфейсы на два пакета, например, myproject.api.pub (public - ключевое слово) и * 1020.*, а затем используйте фильтры на основе пакетов в Eclipse.

0 голосов
/ 14 июля 2011

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

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

Вероятно, можно просто сделать те "публичные" методы, которые вы не хотите использовать, веб-интерфейсом закрытыми;таким образом, вы можете использовать их в общедоступных безопасных методах бизнес-логики.

Хотя, не зная, как устроен ваш проект, привести конкретные примеры отчасти невозможно.

Но сказать;вы можете иметь:com.somecompany.gui> содержит все элементы веб-интерфейсаcom.somecompany.logic> содержит бизнес-логику.

В пакете логики вы создаете классы, которые имеют открытые методы, которые будут использоваться из графического интерфейса пользователя, и приватные или - если это необходимо для других логических компонентов - пакет приватный (защищенный)методы, к которым нет доступа из пакета gui.Таким образом, вы можете отделить свою логику от интерфейса без необходимости делать аннотации, которые вы хотите сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...