Интерфейсный компонент EJB не внедряется в класс реализации JAX-RS? - PullRequest
0 голосов
/ 07 декабря 2018

Я использую WAS 8.5, RAD 9.0, JAX-RS 1.1, Java EE 1.6, EJB 3.0.Есть WebModule (содержит классы отдыха), EJB Module (содержит все классы реализации EJB).Реализация Rest Webservice с использованием jax-rs и получение NullPointerExpection во время вызова службы PUT.

Ниже приведен мой фрагмент кода:

Сервлет web.xml в веб-модуле, который ссылается на JAX-RS Класс в модуле EJB. (Com.implement.services.RestServiceInvoke)

<servlet>
        <description>JAX-RS Tools Generated - Do not modify</description>
        <servlet-name>JAX-RS Servlet</servlet-name>
        <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
        <init-param>
             <param-name>javax.ws.rs.Application</param-name>
             <param-value>com.implement.services.RestServiceInvoke1</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <enabled>true</enabled>
        <async-supported>false</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>JAX-RS Servlet</servlet-name>
        <url-pattern>/jaxrs/*</url-pattern>
    </servlet-mapping>

Класс JAX-RS подобен

Примечание: Нет @ApplicationPath () Annotaion Используется.

public class RestServiceInvoke1 extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(ImplementationRest.class);
        return classes;
    }
}

Класс интерфейса, например:

Примечание: @Local annotation Включается в класс интерфейса, который также не работает

public interface IStudentServices {
 public String getValue(String value);
}

@Stateless
public class StudentServiceBean implements IStudentServices {
   @Override
   public String getValue(String value){
        return value;
   }
}

, и класс реализации службы, например:

@Stateless
@Path("partyservices")
@Resource(name="jdbc/dbname", type=DataSource.class)
public class ImplementationRest implements IEmployeeServices {
      @EJB
      private IStudentServices iStudentSerives;

      @PUT
      @Path("/setprimary")
      @Produces(MediaType.APPLICATION_JSON)
      @Consumes(MediaType.APPLICATION_JSON)
      @Override
      public String getValues1(SamplePojo person){
        iStudentSerives.getValue("string");
        return value;
      }
}

iStudnetServices.getValue ("строка") получает исключение NullpointerException.Я имею в виду IStudentServices не вводится из контейнера.Уже прошел через аналогичную ошибку через Интернет, но нет решений.Пожалуйста, помогите мне решить эту проблему.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

ImplementRest EJB-компонент создается с использованием javax.ws.rs.core.Application вместо EJB-контейнера.

public class RestServiceInvoke1 extends Application {

@Override
public Set<Class<?>> getClasses() {
    Set<Class<?>> classes = new HashSet<Class<?>>();
    classes.add(ImplementationRest.class);
    return classes;
}}

Это причина того, что классы EJB-компонента не внедряются в anohter Beanкоторый был создан с помощью javax.ws.rs.core.Application.Впоследствии я реализовал эту реализацию с помощью Spring Framework , например ejb-local-ref в web.xml, jee: jndi-lookup в bean.xml.Пожалуйста, ознакомьтесь с URL-адресами службы поддержки IBM.

Перейдите по ссылке ниже для подведения итогов этой проблемы.

http://wedowebsphere.de/blogpost/accessing-jpa-jax-rs-service-directly

0 голосов
/ 12 декабря 2018

Существует две распространенные причины, по которым ваш сценарий не работает должным образом:

1 - сервлет неправильно получает ссылку на EJB.Выполнение new ImplementationRest не приводит к EJB, но к простому старому Java-объекту, который не получит никакой инъекции.Сервлет должен будет либо выполнить поиск JNDI для получения ссылки на EJB, либо использовать инъекцию;@EJB или @Inject.

2 - Приложение включает в себя классы EJB API, в частности javax.ejb.EJB, как часть приложения.Когда javax.ejb.EJB упакован вместе с приложением и используется загрузка классов PARENT_LAST, контейнер EJB не распознает аннотацию @EJB, так как он загружен загрузчиком классов приложения, и внедрение не произойдет.

I 'думаю, вы столкнулись с проблемой № 1;вероятно, JAX-RS 1.1 не распознает, что ImplementationRest является EJB, и просто выполняет new ImplementationRest.

...