मैं टोमी में अपना आवेदन चला रहा हूं और जर्सी परीक्षण ढांचे के माध्यम से अपनी जैक्स-आरएस वेब सेवाओं का परीक्षण करने की कोशिश कर रहा हूं।

मैंने नीचे के रूप में मेवेन निर्भरताओं को जोड़ा:

<dependency>
<groupId>org.glassfish.jersey.test-framework</groupId>
    <artifactId>jersey-test-framework-core</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-common</artifactId>
    <version>${jersey.version}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <scope>test</scope>
</dependency>

मेरे संसाधन वर्ग के अंदर मेरे पास है

@Inject
private AuthenticationTokenService authenticationTokenService;

मेरी सेवा वर्ग के अंदर मेरे पास है:

@Inject
private AuthenticationTokenIssuer tokenIssuer;

@Inject
private AuthenticationTokenParser tokenParser;

इन दो वर्गों के अंदर मेरे पास है

@Inject
private AuthenticationTokenSettings settings;

मुझे लगता है कि मेरी समस्या AuthenticationTokenSettings के सदस्य के कारण आती है

@Inject
@Config("token")
private String token;

इन्हें गुण ऑब्जेक्ट के माध्यम से फ़ाइल से क्वालीफायर @Config के साथ इंजेक्शन दिया जाता है।

मैंने हल करने के लिए एक इंजेक्शन रीसोल्वर क्लास लिखा है

@Singleton
public static class ConfigInjectionResolver implements InjectionResolver<Configurable>
{
    private static Properties properties;

    public ConfigurableInjectionResolver()
    {
        properties = new Properties();
        InputStream stream = ConfigurationProducer.class.getResourceAsStream("/application.properties");

        if (stream == null)
        {
            throw new RuntimeException("Cannot find application.properties configuration file.");
        }

        try
        {
            this.properties.load(stream);
        }
        catch (final IOException e)
        {
            throw new RuntimeException("Configuration file cannot be loaded.");
        }
    }

    @Override
    public Object resolve(Injectee injectee, ServiceHandle<?> handle)
    {
        if (String.class == injectee.getRequiredType())
        {
            AnnotatedElement elem = injectee.getParent();
            if (elem instanceof Constructor)
            {
                Constructor ctor = (Constructor) elem;
                Configurable config = (Configurable) ctor.getParameterAnnotations()[injectee.getPosition()][0];
                return properties.get(config.value());
            }
            else
            {
                Configurable configurable = elem.getAnnotation(Configurable.class);
                return properties.get(configurable.value());
            }
        }
        return null;
    }

    @Override
    public boolean isConstructorParameterIndicator()
    {
        return true;
    }

    @Override
    public boolean isMethodParameterIndicator()
    {
        return false;
    }
}

मेरी ओवरराइड कॉन्फ़िगरेशन विधि में मैंने इस तरह अमूर्त बाइंडर बनाया है।

ResourceConfig resourceConfig = new ResourceConfig(
            AuthenticationResource.class);

    resourceConfig.register(new AbstractBinder()
    {
        @Override
        protected void configure()
        {
            bind(AuthenticationTokenService.class).
                    to(AuthenticationResource.class);
            bind(AuthenticationTokenIssuer.class).
                    to(AuthenticationTokenService.class);
            bind(AuthenticationTokenParser.class).
                    to(AuthenticationTokenService.class);
            bind(AuthenticationTokenSettings.class).
                    to(AuthenticationTokenIssuer.class);
            bind(AuthenticationTokenSettings.class).
                    to(AuthenticationTokenParser.class);

            bind(ConfigurableInjectionResolver.class)
                    .to(new TypeLiteral<InjectionResolver<Configurable>>()
                    {
                    })
                    .in(Singleton.class);

.
.
.
.

मेरे पास नीचे जैसा अपवाद है:

Apr 15, 2020 2:05:15 AM org.glassfish.jersey.internal.Errors logErrors
WARNING: The following warnings have been detected: WARNING: HK2 service reification failed for [com.transport.webservices.security.service.AuthenticationTokenService] with an exception:
MultiException stack 1 of 2
java.lang.NoSuchMethodException: Could not find a suitable constructor in com.transport.webservices.security.service.AuthenticationTokenService class.
    at org.glassfish.jersey.inject.hk2.JerseyClassAnalyzer.getConstructor(JerseyClassAnalyzer.java:168)
    .
    .
MultiException stack 2 of 2
java.lang.IllegalArgumentException: Errors were discovered while reifying SystemDescriptor(
    implementation=com.transport.webservices.security.service.AuthenticationTokenService
    contracts={com.transport.webservices.security.api.resource.AuthenticationResource}
    scope=org.glassfish.hk2.api.PerLookup
    qualifiers={}
    descriptorType=CLASS
    descriptorVisibility=NORMAL
    metadata=
    rank=0
    loader=org.glassfish.hk2.utilities.binding.AbstractBinder$2@71a88a3e
    proxiable=null
    proxyForSameScope=null
    analysisName=null
    id=142
    locatorId=0
    identityHashCode=1099971211
    reified=false)
    at org.jvnet.hk2.internal.SystemDescriptor.reify(SystemDescriptor.java:681)
    .
    .

WARNING: HK2 service reification failed for [com.transport.webservices.security.service.AuthenticationTokenService] with an exception:
MultiException stack 1 of 2
java.lang.NoSuchMethodException: Could not find a suitable constructor in com.transport.webservices.security.service.AuthenticationTokenService class.
    .
    .
MultiException stack 2 of 2
java.lang.IllegalArgumentException: Errors were discovered while reifying SystemDescriptor(
    implementation=com.transport.webservices.security.service.AuthenticationTokenService
    contracts={com.transport.webservices.security.api.resource.AuthenticationResource}
    scope=org.glassfish.hk2.api.PerLookup
    qualifiers={}
    descriptorType=CLASS
    descriptorVisibility=NORMAL
    metadata=
    rank=0
    loader=org.glassfish.hk2.utilities.binding.AbstractBinder$2@71a88a3e
    proxiable=null
    proxyForSameScope=null
    analysisName=null
    id=142
    locatorId=0
    identityHashCode=1099971211
    reified=false)
    at org.jvnet.hk2.internal.SystemDescriptor.reify(SystemDescriptor.java:681)
    .
    .

WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 3
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=AuthenticationTokenSettings,parent=AuthenticationTokenIssuer,qualifiers={},position=-1,optional=false,self=false,unqualified=null,672817351)
    .
    .
MultiException stack 2 of 3
java.lang.IllegalArgumentException: While attempting to resolve the dependencies of com.transport.webservices.security.service.AuthenticationTokenIssuer errors were found
    .
    .
MultiException stack 3 of 3
java.lang.IllegalStateException: Unable to perform operation: resolve on com.transport.webservices.security.service.AuthenticationTokenIssuer
    .
    .

WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 5
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=AuthenticationTokenSettings,parent=AuthenticationTokenIssuer,qualifiers={},position=-1,optional=false,self=false,unqualified=null,672817351)
    .
    .
MultiException stack 2 of 5
java.lang.IllegalArgumentException: While attempting to resolve the dependencies of com.transport.webservices.security.service.AuthenticationTokenIssuer errors were found
    .
    .
MultiException stack 3 of 5
java.lang.IllegalStateException: Unable to perform operation: resolve on com.transport.webservices.security.service.AuthenticationTokenIssuer
    .
    .
MultiException stack 4 of 5
java.lang.IllegalArgumentException: While attempting to resolve the dependencies of com.transport.webservices.security.api.resource.AuthenticationResource errors were found
    .
    .
MultiException stack 5 of 5
java.lang.IllegalStateException: Unable to perform operation: resolve on com.transport.webservices.security.api.resource.AuthenticationResource
    .
    .

java.lang.AssertionError: Should return status 200 expected:<200> but was:<500>
    at org.junit.Assert.fail(Assert.java:88)


इसके अलावा मुझे नीचे मेवेन निर्भरताओं को जोड़ना पड़ा क्योंकि मेरे मौजूदा साबुन वर्गों ने जर्सी परीक्षण के लिए मेवेन निर्भरताओं को जोड़ने के बाद संकलन छोड़ दिया था, जो मुझे समझ में नहीं आया। मुझे नहीं पता कि समस्या इस बारे में है।

<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.xml.ws</groupId>
    <artifactId>jaxws-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.jws</groupId>
    <artifactId>javax.jws-api</artifactId>
    <version>1.1</version>
</dependency>
0
gesus 15 अप्रैल 2020, 02:22

1 उत्तर

सबसे बढ़िया उत्तर

मैंने नीचे के रूप में AnnotationLiteral का विस्तार करते हुए एक वर्ग बनाया:

public static class ConfigurableQualifierLiteral extends AnnotationLiteral<Configurable> implements Configurable
{
    String value;

    ConfigurableQualifierLiteral(String value)
    {
        this.value = value;
    }

    @Override
    public String value()
    {
        return value;
    }
}

फिर मेरे AbstractBinder में मैंने अपने एनोटेट सदस्यों को नीचे के रूप में बाध्य किया है:

bind(Long.valueOf(36000)).to(new TypeLiteral<Long>()
            {
            }).qualifiedBy(new TestAuthenticationResource.ConfigurableQualifierLiteral("authentication.jwt.validFor"));
0
gesus 20 अप्रैल 2020, 15:40