В настоящее время я работаю над сервлетом Sling, который использует инфраструктуру OSGi через Apache Felix. Из того, что я понимаю, если вы хотите получить и использовать другую услугу, у вас есть два варианта: 1. Напишите слушателя службы, который гарантирует, что служба, которую вы хотите, зарегистрирована до приобретения и использования вашего сервиса. 2. Используйте @Reference
аннотацию от Apache Felix, чтобы приобрести услугу.Apache Felix @ Проблемы с аннотацией речи
Я хочу сделать вариант 2, поскольку для варианта 1 требуется много кода, который мне не нужно писать.
Итак, вот как я это сделал. Просто отказ от ответственности: что следует за фрагментами моего кода и не составляют весь мой проект. Не ожидайте, что сможете скомпилировать это или что-нибудь еще. Я включил то, что, как я считаю, является соответствующими частями.
Во-первых, у меня есть слинг сервлет:
package mypackage;
import /*necessary imports*/
@Component(name = "My Sling Servlet", immediate = false, metatype = true)
@Properties({
@Property(name = "sling.servlet.paths", value = "/bin/mytest"),
@Property(name = "sling.servlet.methods", value = "GET")
})
@Service(Servlet.class)
public class MyServlet extends SlingSafeMethodsServlet {
@Reference
private MyService service;
// Do stuff with service
}
Насколько я понимаю, @Component
аннотаций позволяет OSGi знать, что этот класс файл определяет компонент. В аннотации @Properties
определены некоторые существенные свойства компонента (в данном случае для нас важно, чтобы мы могли запустить этот сервлет, перейдя на [hostname]/bin/mytest
). Аннотации @Service
позволяют OSGi знать, что этот класс является сервисом (в частности, тем, который реализует класс Servlet), а также регистрирует службу. Наконец, аннотация @Reference
сообщает OSGi, что поле, которое мы собираемся объявить, является уже зарегистрированной службой OSGi в этом комплекте, и мы должны просто ее захватить.
Теперь вот еще один соответствующий файл, который определяет MyService службы:
package mypackage;
import /*necessary imports*/
@Component(name="MyService", immediate=false,metatype=true)
@Service(value = MyServiceInterface.class)
public class MyService implements MyServiceInterface {
// Implementation of MyServiceInterface
}
Здесь мы объявили, что MyService является компонентом OSGi с помощью @Component
аннотацию. Важное замечание здесь состоит в том, что мы использовали аннотацию @Service
, которая, по-видимому, выполняет важную задачу: @Service
аннотация REGISTERS сервис.
Пожалуйста, просто предположим, что есть файл MyServiceInterface.java, который выглядит примерно так:
package mypackage;
import /*necessary imports*/
public interface MyServiceInterface {
//stuff
}
Со всеми этими отборочные из пути, вот мой вопрос. Когда я запускаю свой сервлет, посетив [hostname]/bin/mytest
в веб-браузере, я получаю ошибку на 404 странице. Это означает, что мой браузер не может найти сервлет.
Теперь вы можете спросить себя, почему я так думаю, что это связано с аннотацией @Reference
. Ну, я думаю, что это так ответственно, потому что, комментируя это и приобретая услугу старомодным способом (т. Е. Метод 1 выше), сервлет работает без проблем.
Другая потенциально важная информация заключается в том, что я использую Maven для создания этого проекта. Я рад предоставить соответствующие файлы pom.xml, если вы считаете, что они содержат полезную информацию.
Пожалуйста, помогите мне выяснить, почему мой сервлет не может быть найден, когда я использую аннотацию @Reference
! Если вам нужно, чтобы я предоставил больше информации, прежде чем помогать мне, я буду рад сделать это. Пожалуйста, укажите в комментариях, если я не предоставил достаточную информацию.
Спасибо заранее!
Вы подключили отладчик? Вы реализовали метод #doGet и достигли? – nateyolles
Да, у меня есть отладчик, и я переопределил метод doGet. Метод 'doGet' не достигается, когда присутствует аннотация' @ Reference'. Тем не менее, это определенно достигается, когда я удаляю аннотацию. – Pr4isethesun
Что произойдет, если вы установите значение true? – nateyolles