java - 无法注入资源 - 很可能是不正确的 InjectionServices SPI 实现 CDI
问题描述
我正在关注有关 Java EE 的复数教程之一。但是我在使用 Arquillian 测试我的应用程序时遇到了问题。Mayble github 将提供更多帮助(https://github.com/NoWishGranted/personal)当我使用 eclipse 运行测试用例时,我得到以下堆栈:
Jul 15, 2018 2:30:01 PM org.jboss.weld.bootstrap.WeldStartup <clinit>
INFO: WELD-000900: 2.3.5 (Final)
Jul 15, 2018 2:30:02 PM org.jboss.weld.injection.AbstractResourceInjection getResourceReference
WARN: WELD-000834: Unable to inject resource - most probably incorrect InjectionServices SPI implementation: private javax.persistence.EntityManager com.personal.bookstore.repository.BookRepository.em
at com.personal.bookstore.repository.BookRepository.em(BookRepository.java:0)
我怀疑我的persistence.xml 文件可能有一些错误,但我不知道这是不是真的。(我正在使用wildfly和h2数据库)
持久性.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="bookStorePU" transaction-type="JTA">
<properties>
<property
name="javax.persistence.schema-generation.database.action"
value="drop-and-create" />
<property
name="javax.persistence.schema-generation.scripts.action"
value="drop-and-create" />
<property
name="javax.persistence.schema-generation.scripts.create-target"
value="bookStoreCreate.ddl" />
<property
name="javax.persistence.schema-generation.scripts.drop-target"
value="bookStoreDrop.ddl" />
</properties>
</persistence-unit>
</persistence>
书本模型,没有所有可能的映射:
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length=200)
private String title;
@Column(length=200)
private String description;
@Column(name="unit_cost")
private Float unitCost;
private String isbn;
@Column(name="publication_date")
@Temporal(TemporalType.DATE)
private Date publicationDate;
@Column(name="number_of_pages")
private Integer numberOfPages;
private String imageUrl;
private Language language;
public Book(){
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Float getUnitCost() {
return unitCost;
}
public void setUnitCost(Float unitCost) {
this.unitCost = unitCost;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public Date getPublicationDate() {
return publicationDate;
}
public void setPublicationDate(Date publicationDate) {
this.publicationDate = publicationDate;
}
public Integer getNumberOfPages() {
return numberOfPages;
}
public void setNumberOfPages(Integer numberOfPages) {
this.numberOfPages = numberOfPages;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
public Language getLanguage() {
return language;
}
public void setLanguage(Language language) {
this.language = language;
}
@Override
public String toString() {
return "Book [id=" + id + ", title=" + title + ", description=" + description + ", unitCost=" + unitCost
+ ", isbn=" + isbn + ", publicationDate=" + publicationDate + ", numberOfPages=" + numberOfPages
+ ", imageUrl=" + imageUrl + ", language=" + language + "]";
}
}
BookRepository 类
public class BookRepository {
@PersistenceContext(unitName="bookStorePU")
private EntityManager em;
public Book find(Long id) {
return em.find(Book.class, id);
}
@Transactional(TxType.REQUIRED)
public Book create(Book book) {
em.persist(book);
return book;
}
@Transactional(TxType.REQUIRED)
public void delete(Long id) {
em.remove(em.getReference(Book.class, id));
}
public List<Book> findAll(){
TypedQuery<Book> createQuery = em.createQuery("SELECT b from Book b order by b.title", Book.class);
return createQuery.getResultList();
}
public Long countAll() {
TypedQuery<Long> createQuery = em.createQuery("SELECT count(b) from Book b", Long.class);
return createQuery.getSingleResult();
}
}
测试用例类
@RunWith(Arquillian.class)
public class BookRepositoryTest {
@Inject
private BookRepository bookRepository;
@Test
public void create() {
assertEquals(Long.valueOf(0), bookRepository.countAll());
assertEquals(Long.valueOf(0), bookRepository.findAll());
}
@Deployment
public static JavaArchive createDeployment() {
return ShrinkWrap.create(JavaArchive.class)
.addClass(BookRepository.class)
.addClass(Book.class)
.addClass(Language.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
}
}
pom 依赖项
<dependencies>
<dependency>
<groupId>org.jboss.spec</groupId>
<artifactId>jboss-javaee-7.0</artifactId>
<version>1.0.3.Final</version>
<type>pom</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.arquillian.junit</groupId>
<artifactId>arquillian-junit-container</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.arquillian.container</groupId>
<artifactId>arquillian-weld-ee-embedded-1.1</artifactId>
<version>1.0.0.CR9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-core</artifactId>
<version>2.3.5.Final</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.4</version>
<scope>test</scope>
</dependency>
</dependencies>
解决方案
推荐阅读
- installation - NetAdvantage_NET_20081_CLR20_Product.exe:安装因错误而提前结束
- python - TicTacToe - 如果有赢家,我如何停止游戏,
- c++ - `x = &v` 和 `*x = v` 是等价的吗?
- node.js - 在高端机器上创建反应应用程序生产构建速度非常慢
- reactjs - 某些视图正在加载,而其他视图则不会在后退按钮上按下 ReactJS
- r - data.table::fread 无法使用 cmd 参数读取数据
- c++ - 在非常量上下文中使用 std::size
- java - 使用 Java 将多个图像转换为灰度
- python-3.x - 高效的二维列表初始化 [python]
- gitlab - 逃脱 ';' 在 Terraform GitLab 环境变量中