Объединение проекта 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-зависимостей. Вам нужно убедиться, что они есть, чтобы пример работал.

Примечание: ${spring3.version} Версия в примерах 3.2.3. ВЫПУСК. Можно использовать Spring 4 с примерами, но вам нужно будет обязательно исключить все переходные зависимости Spring из jersey-spring3 зависимость.

[ 1 ] - В примере конфигурации Java следует отметить, что он использует автономное приложение. Для использования конфигурации Java в веб-приложении требуется немного хитрости. Это известная ошибка, когда Джерси ищет параметр contextConfigLocation с расположением applicationContext.xml файл и выдаст исключение, когда оно не найдет.

Я нашел несколько способов обойти это.

  1. Примером этого был упомянут человек, который поднял проблему. Вы можете создать веб-инициализатор 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;
        }
    }
    
  2. Вы можете просто добавить 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>
    
  3. Есть еще один способ, которым я могу придумать, но я сохранил это на время, и я действительно смог проверить это.


ОБНОВИТЬ

"Не удалось прочитать класс компонента-кандидата... 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>
Другие вопросы по тегам