Объединение проекта Spring и Джерси
Я построил проект с помощью Spring JPA, и теперь я хочу использовать его в своем проекте на Джерси. Я добавил свой проект SJPA в качестве зависимости в моем pom.xml
Я хотел бы использовать мои классы обслуживания из моего SJPA, когда я использую методы GET/POST/PUT/DELETE. Есть ли простой способ сделать это с аннотациями? Или я должен получить AnnotationConfigApplicationContext
в каждом классе? Чувствуется вид отходов.
@Path("/users")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public final class UserResource
{
private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
private PodcastService service;
@GET
public Response getAllPodcasts() {
context.scan("org.villy.spring.service");
context.refresh();
service= context.getBean(PodcastService.class);
return Response.ok(service.findAll()).build();
}
}
1 ответ
ПРИМЕЧАНИЕ. Приведенные ниже примеры проектов относятся к основной ветке Jersey, которая в настоящее время представляет собой снимок Jersey 3, который еще не выпущен. Jersey 3 будет использовать Spring 4, поэтому вы можете заметить зависимость jersey-spring4
, Эта зависимость еще не существует, так как Jersey 3 еще не выпущен (вероятно, не на некоторое время). Таким образом, зависимость от использования jersey-spring3
, Все примеры должны работать одинаково, просто меняя эту зависимость. Если вы хотите использовать Spring 4, посмотрите зависимости, перечисленные в примере ниже в этом ответе
Вам не нужно создавать ApplicationContext
где вам нужен сервис. Вы должны быть в состоянии настроить глобальный. Джерси имеет модуль для этого, который объединяет две структуры. Это позволяет вам просто @Autowired
все ваши услуги Spring в ваши классы ресурсов Джерси.
Вместо того, чтобы пытаться привести какой-либо пример, я просто приведу ссылку на официальные примеры. Они прямо из проектов, поэтому ссылки должны быть хорошими в течение некоторого времени. Особо не принимайте Maven-зависимостей. Вам нужно убедиться, что они есть, чтобы пример работал.
- Jersey 2.x с конфигурацией Spring XML
- Джерси 2.x с конфигурацией Spring Java [ 1 ]
- Джерси 1.x с конфигурацией Spring XML
- Джерси 2.x с весенней загрузкой
Примечание: ${spring3.version}
Версия в примерах 3.2.3. ВЫПУСК. Можно использовать Spring 4 с примерами, но вам нужно будет обязательно исключить все переходные зависимости Spring из jersey-spring3
зависимость.
[ 1 ] - В примере конфигурации Java следует отметить, что он использует автономное приложение. Для использования конфигурации Java в веб-приложении требуется немного хитрости. Это известная ошибка, когда Джерси ищет параметр contextConfigLocation
с расположением applicationContext.xml
файл и выдаст исключение, когда оно не найдет.
Я нашел несколько способов обойти это.
Примером этого был упомянут человек, который поднял проблему. Вы можете создать веб-инициализатор Spring, в котором вы настраиваете контекст Spring и переопределяете свойство param. (Смотрите полный пример здесь).
@Order(1) public class SpringWebContainerInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { registerContextLoaderListener(servletContext); // Set the Jersey used property to it won't load a ContextLoaderListener servletContext.setInitParameter("contextConfigLocation", ""); } private void registerContextLoaderListener(ServletContext servletContext) { WebApplicationContext webContext; webContext = createWebAplicationContext(SpringAnnotationConfig.class); servletContext.addListener(new ContextLoaderListener(webContext)); } public WebApplicationContext createWebAplicationContext(Class... configClasses) { AnnotationConfigWebApplicationContext context; context = new AnnotationConfigWebApplicationContext(); context.register(configClasses); return context; } }
Вы можете просто добавить
applicationContext.xml
в путь к классу и просто зарегистрировать весенний класс конфигурации Java в качестве компонента<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean id="config" class="com.your.pkg.SpringAnnotationConfig"/> </beans>
Есть еще один способ, которым я могу придумать, но я сохранил это на время, и я действительно смог проверить это.
ОБНОВИТЬ
"Не удалось прочитать класс компонента-кандидата... ASM ClassReader не удалось проанализировать файл класса - возможно, из-за новой версии файла класса Java, которая еще не поддерживается"
Похоже, это связано с использованием Spring 3 с Java 8. Как я уже сказал, если вы хотите использовать Spring 4, вам нужно будет исключить переходные зависимости Spring из jersey-spring3
и просто измените версию ваших явно объявленных зависимостей Spring. Вот пример, который я тестировал и работает.
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring3</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.0.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.0.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.1</version>
</dependency>