2015-08-06 3 views
1

Я пытаюсь самостоятельно инициализировать свои ресурсы веб-сервисов, переопределяя метод getSingletons из класса Application. Я использую сервер приложений Jboss EAP 6.0. Ниже приведен кодОшибка поиска Ejb при переопределении метода getSingletons из класса Application

@ApplicationPath("/rest") 
public class MyApplication extends Application { 

    private final Set<Object> singletons = new HashSet<Object>(); 

    public MyApplication() { 
     singletons.add(new StudentFacade()); 
    } 

    @Override 
    public Set<Object> getSingletons() { 

     return null; // Accidentally kept it as null but still my webservice was working. Dont know how it was working. 
    } 
} 

@Path("student") 
public class StudentFacade { 

    @Resource(lookup = "java:global/ejb-beginner-sessions-ear/ejb-beginner-sessions-impl/StudentServiceBean!com.ejb.beginner.sessions.api.StudentService") 
    private StudentService studentService; 

    private static final Logger LOGGER = Logger.getLogger(StudentFacade.class.getName()); 

    @GET 
    @Path("list") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Student getStudents() { 

     LOGGER.info("studentService: " + studentService); 
     return new Student(); 
    } 
} 

Тогда я понял, что метод getSingletons возвращается нулем, и спрашиваю, как мой вебсервис все еще работает.

Я думал, что, поскольку я не возвращаю синглтоны, сервер приложений инициализирует веб-службы самостоятельно. Поэтому я удалил @Resource и использовал @Inject, и я получил исключение WELD, заявив, что зависимость не найдена.

Затем я сменил его, чтобы вернуть синглтоны, а затем @Resource не искал ejb, а studentService был равен нулю. Поэтому я использовал InitialContext для поиска ejb, и он работал.

try { 
      InitialContext initialContext = new InitialContext(); 
      StudentService studentService = (StudentService) initialContext 
        .lookup("java:global/ejb-beginner-sessions-ear/ejb-beginner-sessions-impl/StudentServiceBean!com.ejb.beginner.sessions.api.StudentService"); 
      LOGGER.info("studentService1: " + studentService); 
     } catch (NamingException e) { 
      e.printStackTrace(); 
     } 

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

  1. Почему сервер приложений инициализировать WebService, несмотря я вернулся нулевой
  2. Когда я вернулся нуль, почему @Inject не удалось, и только @Resource работал.
  3. Когда я вернул синглоты, почему @Resource не удалось и только InitialContext работал.

ответ

1

«1. Почему сервер приложений инициализировать WebService, несмотря я вернулся нуль»

Когда нет классов/объектов (или просто пустые наборы) возвращается во время поиска, поведение будет вернитесь к сканированию классов для ресурсов и поставщиков (это объясняется спецификацией JAX-RS). После любой класс ресурса или провайдера возвращается с getClasses или getSingleton, предполагается, что разработчик обрабатывает регистрацию, а регистрация классов маршрута отключена.

«2. Когда я вернул нуль, почему @Inject не удалось и только @Resource работал».

Я не вижу случая успеха в любом из ваших аргументов для @Inject, поэтому я не буду пытаться комментировать это. Что касается @Resource, это, по-видимому, правильный способ ввести ваш ресурс. Когда регистрация класса маршрута включена, вы не создаете класс JAX-RS, а время выполнения. Время выполнения также обрабатывает инъекцию. Если вы создадите экземпляр самостоятельно, среда выполнения не будет пытаться вставлять.

«Когда я вернул синглоты, почему @Resource не удалось, и работал только InitialContext».

Об этом частично сказано выше. Когда вы создаете экземпляр класса, инъекция не выполняется. Когда среда выполнения создает экземпляры, она проходит процесс впрыска.


Следует отметить, что при создании экземпляра класс ресурсов будет одноточечным, то есть только один экземпляр для каждого приложения. Это может быть или не быть желаемым поведением.Когда среда выполнения создает экземпляр класса, по умолчанию он будет находиться в области запроса, то есть один экземпляр, созданный для каждого запроса. Опять же, может или не может быть то, что вы хотите. Если вы хотите сохранить регистрацию в классе и по-прежнему быть одноточечным, то аннотация для класса ресурсов с @javax.inject.Singleton должна сделать его одиночным, и все же разрешить инъекцию, поскольку среда выполнения все еще создает экземпляр класса. Если вы хотите, чтобы классы были запрошенными, и хотите сами зарегистрировать все свои классы, переопределите public Set<Class<?>> getClasses() и добавьте свои классы в набор.

+0

Я только что обнаружил, что мой ejb аннотируется с помощью '@ Remote', и поэтому' @ Inject' потерпел неудачу. –

Смежные вопросы