Reputation: 291
I'm just trying to follow along with the jersey docs on dependency injection here: https://jersey.java.net/documentation/latest/ioc.html#d0e15100
I just get grizzly's request failed page if I try to use @Inject on a parameter.
Can someone tell me what I'm doing wrong?
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) {
}
}
Upvotes: 0
Views: 806
Reputation: 123
What you are doing with your binding is in the correct form.
However, you are binding to the @Contract annotated interface "TodoDao", which means that it will look for the interface "TodoDao" for injection. In your class TodoResource, you have "Dao<String>", which won't match. So, if you swap that out for TodoDao, it should find and replace it.
Now, if you want to use the Generic rather than the concrete class, you'll have to use a instantiated object with a wrapper. Something in the form of
bind(x.class).to(new TypeLiteral<InjectionResolver<SessionInject>>(){});
Also, if you want some help binding automagically (kinda like Spring does), you can use the follow this article: http://www.justinleegrant.com/?p=516
Upvotes: 3