gpt4 book ai didi

java - 如何将自定义 DI 与 Jersey 2 和 hk2 一起使用

转载 作者:行者123 更新时间:2023-12-01 22:50:07 24 4
gpt4 key购买 nike

我只是想遵循有关依赖注入(inject)的 Jersey 文档:https://jersey.java.net/documentation/latest/ioc.html#d0e15100

如果我尝试在参数上使用 @Inject,我只会得到 grizzly 的请求失败页面。

有人可以告诉我我做错了什么吗?

Main.java

public class Main extends ResourceConfig {
// Base URI the Grizzly HTTP server will listen on
public static final String BASE_URI = "http://0.0.0.0";
public static URI getBaseURI(String hostname, int port) {
return UriBuilder.fromUri("http://0.0.0.0/").port(port).build();
}

public Main() {
super();

String port = System.getenv("PORT");
if(port == null) {
port = "8080";
}
URI uri = getBaseURI(System.getenv("HOSTNAME"), Integer.parseInt(port));
final HttpServer server = startServer(uri);
System.out.println(String.format("Jersey app started with WADL available at "
+ "%sapplication.wadl\nHit enter to stop it...", BASE_URI));

register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(DaoFactory.class).to(TodoDao.class);
}
});

try {
while(true) {
System.in.read();
}
} catch (Exception e) {

}
}

/**
* Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.
* @return Grizzly HTTP server.
*/
public static HttpServer startServer(URI uri) {

final ResourceConfig rc = new ResourceConfig().packages("com.example");

return GrizzlyHttpServerFactory.createHttpServer(uri, rc);
}

/**
* Main method.
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {

Main m = new Main();

}
}

TodoResource.java

@Path( "todos" )
public class TodoResource {

@Inject Dao<String> dao;

@GET
@Produces(MediaType.TEXT_PLAIN)
public String getIt() {
if(dao == null) {
return "dao is null";
}
StringBuilder builder = new StringBuilder();
for(int i = 0; i < dao.getAll().size(); i++) {
builder.append(dao.getAll().get(i));
}
return builder.toString();
}

}

DaoFactory.java

public class DaoFactory implements Factory<Dao>{

private final Dao dao;


@Inject
public DaoFactory(Dao dao) {
this.dao = dao;
}

@Override
public Dao provide() {
return dao;
}

@Override
public void dispose(Dao d) {

}
}

最佳答案

您对绑定(bind)所做的操作是正确的形式。

但是,您正在绑定(bind)到@Contract注释的接口(interface)“TodoDao”,这意味着它将寻找接口(interface)“TodoDao”进行注入(inject)。在您的 TodoResource 类中,您有“Dao ”,它不匹配。因此,如果您将其替换为 TodoDao,它应该会找到并替换它。

现在,如果您想使用通用类而不是具体类,则必须使用带有包装器的实例化对象。某种形式的东西

bind(x.class).to(new TypeLiteral<InjectionResolver<SessionInject>>(){});

此外,如果您需要一些自动绑定(bind)的帮助(有点像 Spring 那样),您可以使用本文中的内容:http://www.justinleegrant.com/?p=516

关于java - 如何将自定义 DI 与 Jersey 2 和 hk2 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24852191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com