Jersey 和 spring 集成 - bean Injections 在运行时为空为空、spring、Jersey、Injections

由网友(爱够了伤透了°)分享简介:I am trying to inject services into a Rest class that is using Jersey. No matter what or how I try to inject into this class seems to be showing up as null at r...

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

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.

Spring bean

I am completely baffled.

The class looks like this:

@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...");
        }
    } 
}

Any ideas?

Update:

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>

解决方案

Try

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

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

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.

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

阅读全文

相关推荐

最新文章