【发布时间】:2015-09-30 15:22:31
【问题描述】:
由于我在 CDI 文档上苦苦挣扎,我希望这个问题可以成为在 Jersey/Glassfish 中使用正确 CDI 注释的有用资源。
假设我们有一个应用程序BookStore:
package my.bookstore;
import javax.ws.rs.ApplicationPath;
import org.glassfish.jersey.server.ResourceConfig;
@ApplicationPath("/bookstore")
public class BookStore extends ResourceConfig {
public BookStore() {
this.packages("my.bookstore.resource");
}
}
我们想让Book 实体可以通过 RESTful 服务访问:
package my.bookstore.entity;
public class Book {
public String isbn;
public String title;
public String author;
public Book(String isbn, String title, String author) {
this.isbn = isbn;
this.title = title;
this.author = author;
}
}
所以我们需要一个DAO 来访问数据存储区:
package my.bookstore.dao;
import my.bookstore.entity.Book;
import java.util.List;
public interface BookDAO {
public List<Book> getAllBooks();
}
及其实现:
package my.bookstore.dao;
import my.bookstore.entity.Book;
import java.util.List;
import java.util.ArrayList;
public class DefaultBookDAO implements BookDAO {
public List<Book> getAllBooks() {
List<Book> bookList = new ArrayList<>();
list.add(new Book("1234", "Awesome Book", "Some Author"));
return bookList;
}
}
然后我想将DefaultBookDAO注入到RESTful服务中:
package my.bookstore.resource;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/books")
public class BookResource {
@Inject
BookDAO dao;
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Book> getBooks() {
return this.dao.getAllBooks();
}
}
现在,在部署应用程序时,我得到:
Unsatisfied dependencies for type BookDAO with qualifiers @Default
因为我需要让 CDI 意识到这一点;但如何?我尝试了@Named、@Default、@Model、@Singleton、@Stateless 的各种组合,问题和博客文章等许多资源都有自己的解释。
在 Jersey/Glassfish 中使用什么正确、简单的 CDI 注释来使这种注入工作?
【问题讨论】:
-
什么版本的 glassfish?
-
@JohnAment Glassfish 4.1
标签: java dependency-injection glassfish jersey cdi