Jersey 2.22 UnsatisfiedDependencyException

时间:2017-08-24 23:12:52

标签: java maven dependency-injection jersey ejb

我正在使用Wildfly 10和Java 8.我试图绑定我的服务like here但我仍然收到此错误。我能看到的唯一区别在于pom.xml依赖项,但2.0-rc1版本已经过时了。

[io.undertow.request] (default task-2) UT005023: Exception handling request to /api/account: javax.servlet.ServletException: A MultiException has 3 exceptions.  They are:
1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=ICuentaService,parent=CuentaServiceRS,qualifiers={},position=-1,optional=false,self=false,unqualified=null,287721117)
2. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of ar.com.olx.api.rest.CuentaServiceRS errors were found
3. java.lang.IllegalStateException: Unable to perform operation: resolve on ar.com.olx.api.rest.CuentaServiceRS

我的API REST类

@Path("/account")
public class CuentaServiceRS {

    @Inject
    private ICuentaService cuentaService;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Cuenta getCuenta() {

        return cuentaService.getCuentas().get(0);

    }

}

的pom.xml

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.22.2</version>
</dependency>

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.22.2</version>
</dependency>

的web.xml

<servlet>
        <servlet-name>altitudeservlet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>ar.com.villat.bind.ApplicationJaxRS</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

我的应用程序JAX-RS类

public class ApplicationJaxRS extends ResourceConfig {

    public ApplicationJaxRS(){
        register(new CustomBinder());
        packages(true, "ar.com.villat");
    }

}

最后,我的自定义活页夹

public class CustomBinder extends AbstractBinder {

    @Override
    protected void configure() {
        bind(ICuentaService.class).to(CuentaServiceImpl.class);
    }

}

如果您需要更多详情,请告诉我

2 个答案:

答案 0 :(得分:1)

AbstractBinder中,它应为bind(Implementation).to(Contract)。你反过来了。他们这样做的原因是,实施可能有多个合同,因此您可以只链接to次来电。

答案 1 :(得分:1)

从以下位置更改CustomBinder实施:

@Override
protected void configure() {
    bind(ICuentaService.class).to(CuentaServiceImpl.class);
}

@Override
protected void configure() {
    bind(ICuentaService.class).to(CuentaServiceImpl.class);
}

应该适合你。

在一个非常不同的说明中,我会建议这些内容,创建一个界面:

public interface ICuenta { 
    // define an API
    Cuenta getCeunta();
}

然后在课堂上实现它

public class ICuentaService implements ICuenta {
     // implement the API
     Cuenta getCeunta() {
         // get it form somewher and return;
     }
}

并将它们绑定为

@Override
protected void configure() {
    bind(ICuenta.class).to(ICuentaService.class);
}

并在Resource类中进一步使用它:

ICuenta icuenta;

@Inject
public CuentaServiceRS(ICuenta icuenta) {
    this.icuenta = icuenta;
}


@GET
@Produces(MediaType.APPLICATION_JSON)
public Cuenta getCuenta() {
    return icuenta.getCeunta();
}