Struts2 @Inject не работает в веб-сервисах Джерси Рест

Я создал приложение для тестирования внедрения зависимости struts2 (@Inject). Инъекция работает нормально во многих областях, кроме класса обслуживания отдыха, в котором я определил действия веб-сервисов.

Я получаю исключение, как показано ниже

Sep 22, 2014 8:48:50 AM com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException
SEVERE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container
java.lang.NullPointerException
    at usermodules.services.UserModulesServices.userName(UserModulesServices.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

Может кто-нибудь, пожалуйста, скажите мне какое-то решение для этого

struts2.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
<bean class="net.viralpatel.struts2.action.MoreServiceImpl" name="services" />

  <constant name="struts.action.excludePattern" value="/rest/.*" />
    <constant name="struts.enable.DynamicMethodInvocation"
        value="false" />
    <constant name="struts.devMode" value="false" />
    <constant name="struts.custom.i18n.resources"
        value="ApplicationResources" />


    <package name="default" extends="struts-default" namespace="/">
        <action name="login"
            class="net.viralpatel.struts2.action.LoginAction">
            <result name="success">Welcome.jsp</result>
            <result name="error">Login.jsp</result>
        </action>
    </package>
</struts>

UserModulesServices.java

import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import net.viralpatel.struts2.action.MoreServiceImpl;

import com.opensymphony.xwork2.inject.Inject;

@Path("/users")
public class UserModulesServices {

    @Inject("services")
    public MoreServiceImpl moreServiceImpl;

    public MoreServiceImpl getMoreServiceImpl() {
        return moreServiceImpl;
    }

    public void setMoreServiceImpl(MoreServiceImpl moreServiceImpl) {
        this.moreServiceImpl = moreServiceImpl;
    }

    @GET
    @Path("/name/{i}")
    @Produces(MediaType.TEXT_PLAIN)
    public String userName(@PathParam("i") String i) {
        System.out.println("name::::::::" + moreServiceImpl.validate());
        return "{\"name\":\"" + i + "\"}";
    }
}

MoreServiceImpl.java

package net.viralpatel.struts2.action;

public class MoreServiceImpl implements MoreServices{

    @Override
    public String validate() {
        return "testing";
    }

}

2 ответа

Из официальной документации CDI Plugin:

Используйте право @Inject

Struts 2 и его основной компонент XWork используют свой собственный внутренний контейнер внедрения зависимостей. Интересно, что вы можете назвать это бабушкой JSR-330, поскольку это ранняя предварительная версия Google Guice, когда-то разработанная Crazybob Lee - тем же Бобом Ли, который вместе с Родом Джонсоном из SpringSource возглавлял спецификацию JSR-330.

Тем не менее, вы найдете @Inject аннотация как com.opensymphony.xwork2.inject.Inject а также javax.inject.Inject, Не путай эти два - javax.inject.Inject это тот, который вы хотите использовать со своим плагином Struts 2 CDI и интеграцией CDI в целом! Хотя вы также можете использовать внутреннюю аннотацию Struts, эффект может быть странным для неопределенного - так что проверьте свой импорт!

Тогда вместо com.opensymphony.xwork2.inject.Inject
используйте правильный: javax.inject.Inject

Для этого конкретного вопроса вы должны предоставить конфигурацию бина для

<bean class="net.viralpatel.struts2.action.UserModulesServices" name="userModulesServices" />

Впрыск будет работать, но это для внутреннего использования,

Внутри фреймворк использует свой собственный контейнер внедрения зависимостей, который очень похож на Google Guice.

и вы должны рассмотреть возможности для других структур DI. См. Внедрение зависимостей.

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