2015-05-09 2 views
4

Я пытаюсь изучить HK2 для использования шаблона локатора сервисов. Ниже приведен код, который я написал:HK2 с использованием @Named для внедрения реализаций не работает

package org.swx.nursing.ccquerytool.file; 
import org.jvnet.hk2.annotations.Contract; 

@Contract 
public interface FileReader { 
    public void test(); 
} 

Вышеупомянутый интерфейс. Следующие 2 тестовые реализации следующие: package org.swx.nursing.ccquerytool.file;

import javax.inject.Singleton; 
import org.jvnet.hk2.annotations.Service; 

@Service (name="org.swx.nursing.ccquerytool.file.OcxReaderImpl") 
@Singleton 
class OcxReaderImpl implements FileReader{ 
    public void test() { 
    // TODO Auto-generated method stub 
    System.out.println("OCX HelloWorld!!!!"+ ", "); 
    } 
} 

И следующее это второе реализация: пакет org.swx.nursing.ccquerytool.file;

import javax.inject.Singleton; 
import org.jvnet.hk2.annotations.Service; 

@Service (name="org.swx.nursing.ccquerytool.file.RarReaderImpl") 
@Singleton 
class RarReaderImpl implements FileReader{ 
    public void test() { 
    // TODO Auto-generated method stub 
    System.out.println("RAR HelloWorld!!!!"+ ", "); 
    } 
} 

И следующий класс с основной() метод, чтобы проверить это:

package org.swx.nursing.ccquerytool.file; 

import javax.inject.Inject; 
import javax.inject.Named; 

import org.glassfish.hk2.api.ServiceLocator; 
import org.glassfish.hk2.utilities.ServiceLocatorUtilities; 

public class Hk2Test { 

private static ServiceLocator SERVICELOCATOR = ServiceLocatorUtilities.createAndPopulateServiceLocator(); 

@Inject @Named ("org.swx.nursing.ccquerytool.file.OcxReaderImpl") 
public static FileReader fr =SERVICELOCATOR.getService(FileReader.class); 

@Inject @Named ("org.swx.nursing.ccquerytool.file.RarReaderImpl") 
public static FileReader fr2 =SERVICELOCATOR.getService(FileReader.class); 

public static void main(String argv[]) { 

    //FileReader ocxReaderService = SERVICELOCATOR.getService(FileReader.class); 
    //ocxReaderService.test(); 
    fr.test(); 
    fr2.test(); 
    } 
} 

Когда я запускаю это, следующий вывод:

OCX HelloWorld!!!!, 
OCX HelloWorld!!!!, 

, где я ожидал

OCX HelloWorld!!!!, 
RAR HelloWorld!!!!, 

Просьба сообщить, что я делаю неправильно здесь. Благодаря!

+0

Используйте [ 'GetService (FileReader.class, имя);'] (https://hk2.java.net/hk2-api/apidocs/org/glassfish/hk2/api/ServiceLocator.html#getService % 28java.lang.Class,% 20java.lang.String,% 20java.lang.annotation.Annotation ...% 29). Ваш класс 'Hk2Test' не управляется. Инъекции не работают. В любом случае вы создаете его сами, победив цель инъекции –

+0

, которую я изменил, чтобы использовать getService (FileReader.class, name), но получил тот же результат. Не могли бы вы подробнее рассказать о «неконтролируемой» части ее? – Rookie

+0

Жаль, что у меня не было возможности проверить. Но вам может понадобиться использовать аннотацию '@Named (" ... ")'. Кажется, что «имя» в сервисе не работает для этого. Кроме того, управляемый, я имею в виду, что он не управляется контейнером DI. Вы управляете другими классами, поскольку они аннотируются с помощью '@ Service'. Я не думаю, что просто аннотация для класса «Hk2Test» будет работать в этом случае. Не уверен, причина, может быть статическая проблема, проблема основного класса, кто знает. Но создайте еще один класс обслуживания и попробуйте ввести его там (не создавайте экземпляр, просто объявляйте), и инъекция должна работать –

ответ

0

Возможно, если вы поставите эту XML в ваш pom.xml:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.glassfish.hk2</groupId> 
      <artifactId>hk2-inhabitant-generator</artifactId> 
      <version>2.4.0-b20</version> 
      <executions> 
       <execution> 
        <id>generate-inhabitants</id> 
        <goals> 
         <goal>generate-inhabitants</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
+0

Я уже поставил этот xml и не создал папку meta-inf – Rookie

+0

Являются ли ваши файлы java под src/main/java или src/test/java? Еще одна вещь, которую нужно попробовать, - установить зависимость в разделе нормальных зависимостей для hk2-metadata-generator. Может быть, это даст вам больше удачи – jwells131313

0

образца с Hk2Utilities. Заставка в реальном времени!

package org.swx.nursing.ccquerytool.file; 

import javax.inject.Inject; 
import javax.inject.Named; 

import org.glassfish.hk2.api.ServiceLocator; 
import org.glassfish.hk2.api.ServiceLocatorFactory; 
import org.jvnet.hk2.annotations.Service; 

import gov.va.oia.HK2Utilities.HK2RuntimeInitializer; 


@Service 
public class Hk2Test { 

    @Inject 
    @Named("org.swx.nursing.ccquerytool.file.OcxReaderImpl") 
    FileReader fr; 

    @Inject 
    @Named("org.swx.nursing.ccquerytool.file.RarReaderImpl") 
    FileReader fr2; 

    public void test() { 
     fr.test(); 
     fr2.test(); 
    } 

    public static void main(String argv[]) throws Exception { 
     HK2RuntimeInitializer.init("Test", false, "org.swx.nursing.ccquerytool.file"); 
     ServiceLocator locator = ServiceLocatorFactory.getInstance().create("Test"); 
     Hk2Test app = locator.getService(Hk2Test.class);   
     app.test(); 
    } 
} 
Смежные вопросы