Jakarta ee 在EJB和CDIBean之间,数据似乎是vansih

Jakarta ee 在EJB和CDIBean之间,数据似乎是vansih,jakarta-ee,ejb,cdi,Jakarta Ee,Ejb,Cdi,我的JavaEE7CDIBackingBean通过EJB从数据库中获取数据。EJB获取正确的数据并将列表(例如3项)返回给BackingBean。BackingBean获得3项,但所有数据字段都是0或null 背豆: @Named @RequestScoped public class AddActuatorController implements Serializable { ... @EJB protected SensorBeanRemote sensorBean;

我的JavaEE7CDIBackingBean通过EJB从数据库中获取数据。EJB获取正确的数据并将列表(例如3项)返回给BackingBean。BackingBean获得3项,但所有数据字段都是
0
null

背豆:

@Named
@RequestScoped
public class AddActuatorController implements Serializable {
   ...
   @EJB
   protected SensorBeanRemote sensorBean;
   ...
   protected List<Sensor> allSensors;
   ...
   @PostConstruct
   private void init() {
      ...
      logger.info("try to get sensors ... ");
      allSensors=sensorBean.getSensors();
      logger.info("got <"+allSensors.size()+"> sensors");

      Iterator<Sensor> iter=allSensors.iterator();
      Sensor s;
      while(iter.hasNext()){
          s=iter.next();
          logger.info(">>> [" + s.getId()+", "+s.getName()+", +s.getDescription()+"]");
      }
      ...
   }
   ...
}
@Stateless
public class SensorBean implements SensorBeanRemote, SensorBeanLocal {

    @PersistenceContext
    protected EntityManager em;     
    ...
    @Override
    public List<Sensor> getSensors() {
        List<Sensor> sensorList=null;
        try{
            logger.info("try to load sensors from db ...");
            sensorList=em.createNamedQuery("Sensor.FindAll", Sensor.class).getResultList();
            logger.info("Found <"+sensorList.size()+"> sensors");

            Iterator<Sensor> iter=sensorList.iterator();
            Sensor s;
            while(iter.hasNext()){
                s=iter.next();
                logger.info(">>> [" + s.getId()+", "+s.getName()+", "+s.getDescription()+"]");
            }

            return sensorList;
        }catch(Exception e){
            logger.severe("Exception: <"+e.getLocalizedMessage()+">");
        }
        return null;
    }
}
@Entity
@Table(schema="tp_smartHuette", name="sensor")
@NamedQueries({
    @NamedQuery(name="Sensor.FindAll", query="SELECT s FROM Sensor s"),
    ...
    })
public class Sensor extends AbstractElement implements Serializable {
    ...
}
@MappedSuperclass
public abstract class AbstractElement implements Element {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected long id;

    @ManyToOne
    protected Location location; 

    @Basic
    protected String name;

    @Basic
    protected String description;

    @Basic
    protected String host;

    @Basic
    protected int port;

    @Basic
    protected String authentication;
    ...
}
传感器超类:

@Named
@RequestScoped
public class AddActuatorController implements Serializable {
   ...
   @EJB
   protected SensorBeanRemote sensorBean;
   ...
   protected List<Sensor> allSensors;
   ...
   @PostConstruct
   private void init() {
      ...
      logger.info("try to get sensors ... ");
      allSensors=sensorBean.getSensors();
      logger.info("got <"+allSensors.size()+"> sensors");

      Iterator<Sensor> iter=allSensors.iterator();
      Sensor s;
      while(iter.hasNext()){
          s=iter.next();
          logger.info(">>> [" + s.getId()+", "+s.getName()+", +s.getDescription()+"]");
      }
      ...
   }
   ...
}
@Stateless
public class SensorBean implements SensorBeanRemote, SensorBeanLocal {

    @PersistenceContext
    protected EntityManager em;     
    ...
    @Override
    public List<Sensor> getSensors() {
        List<Sensor> sensorList=null;
        try{
            logger.info("try to load sensors from db ...");
            sensorList=em.createNamedQuery("Sensor.FindAll", Sensor.class).getResultList();
            logger.info("Found <"+sensorList.size()+"> sensors");

            Iterator<Sensor> iter=sensorList.iterator();
            Sensor s;
            while(iter.hasNext()){
                s=iter.next();
                logger.info(">>> [" + s.getId()+", "+s.getName()+", "+s.getDescription()+"]");
            }

            return sensorList;
        }catch(Exception e){
            logger.severe("Exception: <"+e.getLocalizedMessage()+">");
        }
        return null;
    }
}
@Entity
@Table(schema="tp_smartHuette", name="sensor")
@NamedQueries({
    @NamedQuery(name="Sensor.FindAll", query="SELECT s FROM Sensor s"),
    ...
    })
public class Sensor extends AbstractElement implements Serializable {
    ...
}
@MappedSuperclass
public abstract class AbstractElement implements Element {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected long id;

    @ManyToOne
    protected Location location; 

    @Basic
    protected String name;

    @Basic
    protected String description;

    @Basic
    protected String host;

    @Basic
    protected int port;

    @Basic
    protected String authentication;
    ...
}

这是我的第一个java ee项目,由于设计奇怪,请耐心等待。

这看起来像是序列化问题。如果使用
@Remote
接口,对象在被EJB返回之前会被序列化(因为它期望位于不同的服务器上),而使用
@Local
可以直接传递对象引用

数据字段为空,因为
AbstractElement
不可序列化-在这种情况下,java序列化机制将序列化
Sensor
类中的字段,但通过调用父类的无参数构造函数来构造一个新的超类,这会将超类的所有字段设置为默认值


要修复它,只需使
AbstractElement
实现
可序列化

您也应该发布传感器实体类,或者至少发布带有注释的属性等。您是否对
@Local
接口有相同的问题?您的实体类可能是从两个类路径加载的。所以,当设置它们的值时,类从一个路径加载(根据优先级在类路径中第一次出现)。但当您获取时,类是从不同的路径加载的。只需确保类仅位于一个位置。
Location
是否实现了java.io.Serializable?是的,
Location
实现了
java.io.Serializable
。很抱歉,我不理解“可能会发生从两个类路径加载实体类的情况”。现在,它只有一个glassfish服务器(而且
@Local
可能就足够了)。感谢您的解释。