java जर्सी एचके 2 इंजेक्शन @ सर्विस एनोटेटेड क्लासेस




service jersey (4)

मेरे जीवन के लिए मैं जर्सी को एचके 2 से स्वचालित रूप से @ नौसिखत वर्गों को खोजने और उनको इंजेक्ट करने के लिए नहीं मिल सकता है। मैंने स्टैक ओवरफ्लो, जर्सी और एचके 2 दस्तावेज पर हर सलाह का पालन करने का प्रयास किया है और अभी भी कोई भाग्य नहीं है। मैं एक जर्सी संसाधन में एक सरल गूंज सेवा को इंजेक्ट करने की कोशिश कर रहा हूं। कंकाल जर्सी के लिए सरल वेबएप मेवेन मूलरूप से उत्पन्न होता है, जिसे मैंने विस्तारित करने की कोशिश की थी अभी तक मेरे पास इतना ही है:

pom.xml

<build>
  <finalName>sandbox</finalName>
  <plugins>
    <plugin>
      <groupId>org.glassfish.hk2</groupId>
      <artifactId>hk2-inhabitant-generator</artifactId>
      <version>2.3.0</version>
      <executions>
        <execution>
          <configuration>
            <verbose>true</verbose>
          </configuration>
          <goals>
            <goal>generate-inhabitants</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
...
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.glassfish.jersey</groupId>
      <artifactId>jersey-bom</artifactId>
      <version>${jersey.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
  </dependency>
  <dependency>
    <groupId>org.glassfish.hk2</groupId>
    <artifactId>hk2</artifactId>
    <version>2.3.0</version>
  </dependency>
</dependencies>

web.xml

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>my.package.jerseytest</param-value>
    </init-param>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>my.package.jerseytest.application.Application</param-value>
    </init-param>    

    <load-on-startup>1</load-on-startup>
</servlet>

my.package.jerseytest.application.Application

public class Application extends ResourceConfig {
    public Application() {
        ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator();
    }
}

my.package.jerseytest.service.EchoService

@Service
public class EchoService {
    public String generateResponse(String echo) {
        return echo;
    }
}

my.package.jerseytest.resource.MyResource

@Path("myresource")
public class MyResource {

    @Inject
    EchoService echoService;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getIt() {
        return echoService.generateResponse("Got it!");
    }
}

मैंने जांच की है कि अवरुद्ध जनरेटर वास्तव में चलाता है और इसके उत्पादन का उत्पादन करता है, फिर भी जब टॉमकेट सर्वर को चलाने पर http://localhost:8080/sandbox/webapi/myresource प्राप्त हो रहा है

SEVERE: Servlet.service() for servlet [Jersey Web Application] in context with path [/sandbox] threw exception [A MultiException has 3 exceptions.  They are:
1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=EchoService,parent=MyResource,qualifiers={},position=-1,optional=false,self=false,unqualified=null,932014249)
2. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of my.package.jerseytest.resource.MyResource errors were found
3. java.lang.IllegalStateException: Unable to perform operation: resolve on my.package.jerseytest.resource.MyResource
] with root cause
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=EchoService,parent=MyResource,qualifiers={},position=-1,optional=false,self=false,unqualified=null,932014249)

मुझे याद आ रही किसी भी विचार? किसी भी सहायता के लिए धन्यवाद :(

नायब! मुझे इसके बारे में मालूम है

लेकिन उन्होंने मेरी मदद नहीं की ...


अपने अनुप्रयोग कन्स्ट्रक्टर में स्कैन की आवश्यकता वाले पैकेज को जोड़ने का प्रयास करें। संकुल पर "सच" पैरामीटर का मतलब है कि पैकेज को बार-बार स्कैन करना है:

public class Application extends ResourceConfig {
    public Application() {
        packages(true, "my.package.jerseytest");
        ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator();
    }
}

मैंने इस समस्या को हल करने के लिए एक ऐसी कक्षा का उपयोग करके अपनी समस्या को हल किया है जो एब्सटबैन्डर का विस्तार करता है, इसे तत्काल और आवेदन के साथ पंजीकृत कर रहा है।

resourceConfig.register(new DependencyBinder());

इसके अलावा,

/**
 * dependency injection bindings.
 * Jersey requires that service implementations are bound to their contracts this way.
 */
public final class DependencyBinder extends AbstractBinder {

    @Override
    protected final void configure() {
        bind(StatusServiceImpl.class).to(StatusService.class);
    }
}

packages(true, "my.package.jerseytest"); उपयोग करें packages(true, "my.package.jerseytest"); और org.glassfish.jersey.spi.Contract न करें org.jvnet.hk2.annotations.Contract एनोटेशन का उपयोग करें। और जेनेरिक बिना सरल इंटरफेस का उपयोग करें


मैं इन दो सवालों से प्राप्त अंतर्दृष्टि का संयोजन कर रहा हूं:

  • ServiceLocator कैसे @ सेवा और @ संपर्क HK2 में स्वचालित रूप से संपर्क करता है?
  • जर्सी + भूरा + एचके 2: निर्भरता इंजेक्शन, लेकिन संसाधन में नहीं

सबसे पहले, अपनी बिल्ड श्रृंखला में HK2 मेटाडेटा जेनरेटर (या निवासी जेनरेटर) का उपयोग करें (जैसा कि आप पहले से करते हैं)। यह आपके स्रोत को स्कैन करेगा और META-INF/hk2-locator/default

दूसरे, मेटाडाटा से सेवाओं के साथ पॉपुलेटेड एक नया ServiceLocator बनाएं:

ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator();

अब इसे Grizzly से पास करें @Peskillet का हवाला देते हुए:

जर्सी की अपनी सेवासूचक है, और इसके लिए संदर्भ प्राप्त करने का प्रयास करना आसान नहीं है। हम जर्सी को हमारे सेवासूत्रदाता दे सकते हैं, लेकिन जर्सी अंततः अभी भी इसे अपना लोकेटर बनाता है और हमारे लोकेटर के साथ इसे आबाद करेगा।

ResourceConfig config = new MyApplicationConfig();
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(
    URI.create(BASE_URI),
    config, 
    serviceLocator
);




hk2