RESTEasy + Spring 3 + Maven

У меня возникли проблемы с настройкой приложения для использования RESTEasy + Spring 3 + Maven. Пока это то, что у меня есть:

Сервисный интерфейс:

package com.test.service;
public interface ProcessRequestService {
    String test();
}

Внедрение сервиса:

package com.test.service;
import org.springframework.stereotype.Service;

@Service
public class ProcessRequestServiceImpl implements ProcessRequestService {
    @Override
    public String test() {
        return "Resteasy Test";
    }
}

Составная часть:

package com.test.web;

@Component
@Path("/message")
public class Main {

    @Autowired
    private ProcessRequestService processRequestService;

    public void setService(ProcessRequestService processRequestService) {
        this.processRequestService = processRequestService;
    }

    @GET
    @Path("/example")
    public Response example() {
        String result = processRequestService.test();
        return Response.status(200).entity(result).build();
    }
}

Мой pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com</groupId>
    <artifactId>test</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>test</name>
    <url>http://maven.apache.org</url>

    <properties>
        <spring.version>3.2.8.RELEASE</spring.version>
        <resteasy.version>3.0.4.Final</resteasy.version>
    </properties>

    <repositories>
        <repository>
            <id>JBoss repository</id>
            <url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxrs</artifactId>
            <version>${resteasy.version}</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>client</finalName>
    </build>

</project>

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0" metadata-complete="true">

    <context-param>
        <param-name>resteasy.scan</param-name>
        <param-value>true</param-value>
    </context-param>

    <context-param>
        <param-name>resteasy.servlet.mapping.prefix</param-name>
        <param-value>/api</param-value>
    </context-param>

    <listener>
        <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
    </listener>

    <servlet>
        <servlet-name>resteasy-servlet</servlet-name>
        <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>resteasy-servlet</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
    </context-param>

</web-app>

И, наконец, mvc-dispatcher.servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="com.test" />
    <context:annotation-config />

</beans>

Чего я пытаюсь избежать, так это объявлять множество bean-компонентов в xml-файле с помощью аннотации @Service.

При развертывании этого приложения в jboss 6.1 я получаю исключение NullPointerException. Я думаю, это потому, что Spring не может автоматически связать сервис с компонентом, но я не уверен, почему это происходит.

Я смог добиться этого, внеся некоторые изменения в этот учебник, но вместо RESTEasy он использует SpringMampping.

Любая помощь будет оценена.

2 ответа

Решение

У меня была такая же проблема. Пожалуйста, попробуйте это.

В файле POM добавьте следующую зависимость:

<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-spring</artifactId>
<version>3.0.4.Final</version>
</dependency>

А в mvc-dispatcher.servlet.xml добавьте определение bean-компонента выше компонента-scan

<bean class="org.jboss.resteasy.plugins.spring.SpringBeanProcessorServletAware"/>

Это решит исключение нулевого указателя. Надеюсь, это поможет.

Чего я пытаюсь избежать, так это объявляю множество bean-компонентов в xml-файле, используя аннотацию @Service

То, что вы делаете, прекрасно. Сопоставление аннотаций вместо XML - это не то, что дает вам NullPointerException,

При развертывании этого приложения в jboss 6.1 я получаю исключение NullPointerException. Я думаю, это потому, что Spring не может автоматически связать сервис с компонентом, но я не уверен, почему это происходит

Да, JBoss не может вводить, потому что JAX-RS (в вашем случае RESTEasy) не знает о бобах Spring. Они не интегрированы из коробки.

Это происходит потому, что реализация JAX-RS не будет выглядеть из @Autowired в его ресурсах (ресурсы в этом контексте @Path аннотированные классы).

Вам нужна дополнительная работа для использования Spring Beans внутри контейнера Java EE.

Любая помощь будет оценена

Все варианты, которые я могу найти:

Кстати, я не проверял эти примеры. Другие варианты:

  • Просто зайдите с Spring MVC, как вы упомянули.
  • Используйте EJB вместо Spring Beans, что имеет смысл, поскольку вы находитесь под сервером Java EE.
  • Может быть, попробовать Джерси.

Имейте в виду, что транзакция Spring не зависит от транзакции Java EE. Вы смешиваете JAX-RS с Spring. Сделка потребует дополнительной любви.

Если бы я был вами, я бы подумал об использовании EJB вместо Spring Beans, если это возможно.

У меня возникают проблемы при попытке настроить приложение на использование RESTEasy + Spring 3 + Maven

Проверьте еще один мой ответ на эту тему. Возможно, это поможет вам решить, какой движок RESTful больше подходит для вашего решения.

Весенние аннотации для запросов GET

Другие вопросы по тегам