2017-01-10 21 views
0

Я пытаюсь использовать hk2 DI в майке, и я прочитал несколько текстов по этому вопросу. (Большинство из датировано я думаю) В настоящее время у меня есть класс, который расширяет ResourceConfig:
Как использовать HK2 DI framkework с Джерси 2?

public class MyApplication extends ResourceConfig{ 
    public MyApplication(){ 
     register(new AbstractBinder() { 
      @Override 
      protected void configure() { 
       bind(AuthenticationServiceImpl.class).to(AuthenticationService.class); 
       bind(PropertiesHandlerImpl.class).to(PropertiesHandler.class).in(Singleton.class); 
      } 
     }); 
     packages(true, "com.myclass");  } 
} 

и в другом классе я стараюсь придать одну из этих связанных классов:

public class JDBCConnectionStrategy implements DatabaseConnectionStrategy { 
    private Connection connection; 

    @Inject 
    PropertiesHandlerImpl propertiesHandler; 

    public JDBCConnectionStrategy() throws SQLException{ 
     try { 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      String host = propertiesHandler.getProperty("host"); 
      String userName = propertiesHandler.getProperty("userName"); 
      String password = propertiesHandler.getProperty("password"); 
      //Create a connection 
      this.connection = DriverManager.getConnection(host, userName, password); 
     } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 
.... 
} 

объявлена ​​следующим образом:

@Singleton 
@Service 
public class PropertiesHandlerImpl implements PropertiesHandler {...} 

Проблема: Я получаю следующее сообщение об ошибке, когда я запуск моего приложения

WARNING: The following warnings have been detected: WARNING: Unknown HK2 failure detected: 
MultiException stack 1 of 2 java.lang.NullPointerException 
    at com.myclass.JDBCConnectionStrategy.<init> 

Update:
Я хотел бы добавить, что я добавил пакет прикладных программ для сканируемого пути в web.xml:

<init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.myclass.system.CmisApplication</param-value> 
    </init-param> 
+0

Я вижу одно неправильно, но я не решаются разместить его в ответ, потому что я не вижу проблемы о любом месте в вашем посте. Какая _exactly_ проблема, с которой вы сталкиваетесь (например, error/stacktrace/exception)? –

+0

@peeskillet Я получаю исключение NullPointerException при использовании введенных свойствHandler, например, –

+0

@ Сервис только работает, если вы используете один из автоматических методов для сообщения hk2 о ваших сервисах. Чтобы использовать автоматические методы, вам, вероятно, нужно вызвать что-то вроде https://hk2.java.net/2.5.0-b31/apidocs/org/glassfish/hk2/utilities/ServiceLocatorUtilities.html#createAndPopulateServiceLocator. В общем, прочитайте эту страницу для информации об населении автоматического обслуживания: https://hk2.java.net/2.5.0-b31/getting-started.html#Automatic_Service_Population – jwells131313

ответ

1

Так я вижу кое-что неправильно.

  1. Вводимый тип должен быть типом «договор», как и в bind(Impl).to(Contract). to(Contract) указывает, какой должен быть тип «рекламируемого» для инъекции.

    Таким образом, вместо того, чтобы пытаться придать PropertiesHandlerImpl, вы бы впрыснуть с контрактом PropertiesHandler

    @Inject 
    PropertiesHandler handler; 
    
  2. Я не вижу, как вы используете JDBCConnectionStrategy. Он не настроен в вашем AbstractBinder, поэтому я предполагаю, что вы просто создаете его сами. Это не сработает. Вы также должны подключить его к системе DI и ввести его.

  3. Ввод в эксплуатацию происходит после строительство. Таким образом, вы не можете использовать службу внутри конструктора, если вы не введете ее в конструктор.

    @Inject 
    public JDBCConnectionStrategy(PropertiesHandler handler) { 
    
    }