Интеграция Джерси и весны - Инъекции бобов являются нулевыми во время выполнения - PullRequest
5 голосов
/ 13 июля 2011

Я пытаюсь внедрить сервисы в класс Rest, который использует Джерси.

Независимо от того, что или как я пытаюсь внедрить в этот класс, кажется, что во время выполнения он отображается как нулевой. Просмотр файлов журналов показывает, что setJsonTestService вызывается при инициализации веб-приложения и что в данный момент оно не является нулевым. Но при последующем доступе к нему с помощью запроса PUT к этому классу он становится пустым.

Я полностью сбит с толку.

Класс выглядит так:

@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 (Джерси)

<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>

1 Ответ

4 голосов
/ 13 июля 2011

Попробуйте

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

Вам также понадобится contextConfigLocation <context-param>, но я предполагаю, что он у вас есть. См. Здесь для получения более подробной информации о настройке.

. Как предполагает Мэтт b, Spring создает ваши объекты, но Джерси ничего не знает о Spring и создает их снова сам.Когда вы используете SpringServlet, он должен найти контекст приложения Spring.

Тем не менее, spring-mvc обеспечивает поддержку служб RESTful, которая очень похожа на JAX-RS.Вы также можете попробовать это.

...