0

次のコードがあります。

MonsterEJB.java:

package model;

import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;

@Stateless
@LocalBean
@Named
public class MonsterEJB 
{
    @PersistenceUnit(unitName="mongo")
    private EntityManager em;

    @Inject
    private Monster injectableMonster;

    public MonsterEJB() 
    {

    }

    public void create() 
    {
        em.getTransaction().begin();
        Monster en = new Monster();
        en.setDescription(injectableMonster.getDescription());
        em.persist(en);
        em.getTransaction().commit();
    }

    public List<Monster> getList() 
    {
        Query query = em.createQuery("Select m from Monster m");
        List<Monster> Monsters = query.getResultList();

        return Monsters;
    }

    public void remove()
    {
        em.getTransaction().begin();
        Monster en = em.find(Monster.class, injectableMonster.getId());
        em.remove(en);
        em.getTransaction().commit();
    }

    public void update() 
    {
        em.getTransaction().begin();
        Monster en = em.find(Monster.class, injectableMonster.getId());
        en.setDescription(injectableMonster.getDescription());
        em.getTransaction().commit();
    }
}

Monster.java:

package model;

import java.io.Serializable;

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import javax.persistence.*;

import org.eclipse.persistence.nosql.annotations.*;

@Entity
@Named
@RequestScoped
@NoSql(dataFormat = DataFormatType.MAPPED)
public class Monster implements Serializable 
{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Field(name = "_id")
    private String id;

    @Version
    private long version;

    @Basic
    private String description;

    public Monster() 
    {

    }

    public String getId() 
    {
        return id;
    }

    public void setId(String id) 
    {
        this.id = id;
    }

    public String getDescription() 
    {
        return description;
    }

    public void setDescription(String description) 
    {
        this.description = description;
    }

    @Override
    public String toString() 
    {
        return "Monster [id=" + id + ", version=" + version + ", description="+ description;
    }
}

persistence.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<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" xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit name="mongo" transaction-type="RESOURCE_LOCAL">
        <class>model.Monster</class>
        <properties>
            <property name="eclipselink.target-database" value="org.eclipse.persistence.nosql.adapters.mongo.MongoPlatform"/>
            <property name="eclipselink.nosql.connection-spec" value="org.eclipse.persistence.nosql.adapters.mongo.MongoConnectionSpec"/>
            <property name="eclipselink.nosql.property.mongo.port" value="27017"/>
            <property name="eclipselink.nosql.property.mongo.host" value="localhost"/>
            <property name="eclipselink.nosql.property.mongo.db" value="MonsterDatabase"/>
            <property name="eclipselink.logging.level" value="FINEST"/>
        </properties>
    </persistence-unit>
</persistence>

Show.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">

<ui:composition template="WEB-INF/templates/BasicTemplate.xhtml">

    <ui:define name="header">
        <div style="width:100%;font-size:36px;line-height:48px;background-color:navy;color:white">Showing Monsters</div>
    </ui:define>

    <ui:define name="content">
        <h:dataTable var="f2" value="#{MonsterEJB.list}">
            <h:column>#{f2.id}, #{f2.description}</h:column>
        </h:dataTable>
    </ui:define>

</ui:composition>
</html>

Web ページに表示されるエラー

type Exception report

message

descriptionThe server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB
root cause

javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB
root cause

javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB
root cause

javax.ejb.CreateException: Could not create stateless EJB
root cause

java.lang.IllegalStateException: Exception attempting to inject Env-Prop: model.MonsterEJB/em@Field-Injectable Resource. Class name = model.MonsterEJB Field name=em@java.lang.String@@@ into class model.MonsterEJB
root cause

com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Env-Prop: model.MonsterEJB/em@Field-Injectable Resource. Class name = model.ElnotEJB Field name=em@java.lang.String@@@ into class model.MonsterEJB
root cause

java.lang.IllegalArgumentException: Can not set javax.persistence.EntityManager field model.MonsterEJB.em to com.sun.enterprise.container.common.impl.EntityManagerFactoryWrapper

質問: MonsterEJB.java で EntityManager に NoSQL を注入するにはどうすればよいですか?

4

2 に答える 2

3

@PersistenceUnit の代わりに @PersistenceContext を使用してみてください

于 2015-08-14T14:57:05.467 に答える
1

これがあなたの例外の正確な原因であるかどうかはわかりませんが、あなたのクラスには同時にMonsterEJB注釈が付けられています。は、とを定義するために使用されます。これらは異なるものです。@Named@Stateless@NamedJSF Managed Bean@StatelessEnterprise Java Beans

いずれかのアノテーションを使用してください。

さらに、Monsterクラスは同時に次のように定義されます:an EntityManagedBeanthrough@Namedアノテーション、およびCDIBeanthroughjavax.enterprise.context.RequestScopedアノテーション。そして、これも意味がありません。

これらの概念を明確にするために、 Java EE 6チュートリアル(このような)を学習することをお勧めします。

于 2012-07-25T15:19:10.380 に答える