Jersey 和 spring 集成 - bean 注入在运行时为空 [英] Jersey and spring integration - bean Injections are null at runtime

查看:37
本文介绍了Jersey 和 spring 集成 - bean 注入在运行时为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将服务注入到使用 Jersey 的 Rest 类中.

I am trying to inject services into a Rest class that is using Jersey.

无论我如何或如何尝试注入此类,似乎在运行时都显示为 null.查看日志文件显示,在 Web 应用程序初始化时调用了 setJsonTestService 并且此时它不为空.但是,当稍后通过对此类的 PUT 请求访问它时,它为空.

No matter what or how I try to inject into this class seems to be showing up as null at runtime. Looking in the log files shows that the setJsonTestService is being called when the web app is initialized and that it isn't null at this point. But, when access it later with a PUT request to this class, it is null.

我完全不知所措.

类看起来像这样:

@Named
@Path("JsonTest")
public class JsonTest {
    @Context
    Request request;
    @Context
    UriInfo uriInfo;

    protected final Logger log = Logger.getLogger(getClass());

    private JsonTestService jsonTestService;

    @Autowired
    public void setJsonTestSerivce(JsonTestService jsonTestService) {
        log.info("Setting JsonTestService.");
        if (jsonTestService == null) {
            log.info("JsonTestService is null at injection");
        }
        this.jsonTestService = jsonTestService;
    }

    @Inject
    public ScrapIntermediate scrapIntermediate; // just a plain empty class with an is true method

    @PUT
    @Path("{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public void putJson(@PathParam("id") String id) {
        log.info("Putting some json at " + id);
        if (scrapIntermediate == null) {
            log.info("scrapIntermediate is null...");
        }
        if (jsonTestService != null) {
            jsonTestService.sendUpdate();
        } else {
            log.info("jsonTestService is null...");
        }
    } 
}

有什么想法吗?

更新:

web.xml(球衣)

web.xml (Jersey)

<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>EDAS</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

推荐答案

尝试

<servlet-class>
     com.sun.jersey.spi.spring.container.servlet.SpringServlet
</servlet-class>

您还需要 contextConfigLocation <context-param>,但我假设您拥有它.请参阅此处了解有关设置的更多详细信息

You will also need the contextConfigLocation <context-param>, but I assume you have it. See here for more details about the setup

正如 matt b 建议 spring 实例化你的对象一样,但 Jersey 对 spring 一无所知并再次实例化它们.当您使用 SpringServlet 时,它应该定位 spring 应用程序上下文.

As matt b suggested spring instantiates your objects, but Jersey does not know anything about spring and instantiates them itself again. When you use the SpringServlet it should locate the spring application context.

也就是说,spring-mvc 提供了对 RESTful 服务的支持,这与 JAX-RS 的服务非常相似.你也可以试试.

That said, spring-mvc provides support for RESTful services that is very similar to that of JAX-RS. You can try it as well.

这篇关于Jersey 和 spring 集成 - bean 注入在运行时为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆