java - 作为 Spring 组件的 Jersey REST 服务

标签 java rest service jersey

我的应用程序中有一个休息服务,我希望它使用 spring beans。 我使用的 Spring 是 2.5 版。 web.xml 的一部分:

<servlet>
    <servlet-name>jersey-servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.app.rest</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>jersey-servlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

在 pom.xml 中我有依赖项:

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.8</version>
</dependency>
<dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.8</version>
</dependency>

我在 context.xml 中添加了:

<context:component-scan base-package="com.app.rest"/>

还有:

<tx:annotation-driven proxy-target-class="true" />

服务类中有趣的部分:

@Component
@Path("/notification")
@Scope("singleton")
public class PushNotification {

    @Autowired
    //@Resource(name = "sendMessageServiceFacade")
    private SendMessageServiceFacade sendMessageServiceFacade;

    @Autowired
    //@Resource(name = "responseCode")
    private NotificationResponseMessage responseCode;

    @Autowired
    //@Resource(name = "validator")
    private PushMessagePreValidator validator;

    @POST
    @Path("/register")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response registerDevice(PushWooshRegisterDeviceDto dto) {
        if (validator.validate(dto) == 200) {
            return invokePushMessage(dto, PushMessageType.REGISTER.getMsgType());
        } else {
            return buildFailResponse();
        }
    }

    @GET
    @Path("/{param}")
    public Response ping(@PathParam("param") String param) {
        return Response.status(200).entity(param).build();
    }

GET 方法按预期工作(基本上它工作 :)),但 POST 方法在线抛出 NullPointerException:if (validator.validate(dto) == 200).

我不知道为什么 @Autowired 注释在这里不起作用,我用 @Resource 尝试过 - 同样的效果。

任何提示都可能有所帮助。

提前致谢, 马立克。

最佳答案

如果您想将 Jersey 与 Spring 一起使用,则需要利用 Spring 集成模块 - 即依赖于 jersey-spring 并使用 SpringServlet 而不是 Jersey ServletContainer servlet 类。有关更多信息,请参见此处:http://jersey.java.net/nonav/apidocs/latest/contribs/jersey-spring/com/sun/jersey/spi/spring/container/servlet/package-summary.html

关于java - 作为 Spring 组件的 Jersey REST 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10998241/

相关文章:

java - SWIG 不接受指针参数的包装对象

java - 制作一个真正弹出的 JPopupMenu

java - jersey 2 上下文注入(inject)基于没有单例的 HttpRequest

grails - 从集成测试中的服务访问 servletContext

android - setForeground() 可以被具有相同通知的多个服务使用吗?

java - gcloud : Default Application Credentials in appengine for Cloud Storage (java)

java - 如何在 vaadin10 或自定义默认主题(lumo)中创建自定义主题

angular - typescript 通用服务

java - 客户端需要哪些 SSL 工件用于 java 中的相互握手

javascript - Bing map 获取以预定义距离间隔落在该路线上的位置的路线路径坐标