数据似乎在 EJB 和 CDI bean 之间传输
Data seem to vansih between EJB and CDI bean
My Java EE 7 CDI BackingBean,通过 EJB 从数据库中获取数据。 EJB 将正确的数据和 returns 列表(例如 3 项)获取到 BackingBean。 BackingBean 获得 3 个项目,但所有数据字段都是 0
或 null
.
BackingBean:
@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()+"]");
}
...
}
...
}
EJB:
@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;
}
}
在日志文件中我得到:
2015-10-09T18:01:14.094+0200 ... try to get sensors ...
2015-10-09T18:01:14.102+0200 ... try to load sensors from db ...
2015-10-09T18:01:14.384+0200 ... Found <3> sensors
2015-10-09T18:01:14.385+0200 ... 6, huette1, Sensor in der Huette 1
2015-10-09T18:01:14.385+0200 ... 8, huette2, Sensor 2 in Haus 1
2015-10-09T18:01:14.385+0200 ... 9, dfsdf, sdfsd]
2015-10-09T18:01:14.394+0200 ... got <3> sensors
2015-10-09T18:01:14.395+0200 ... 0, null, null
2015-10-09T18:01:14.395+0200 ... 0, null, null
2015-10-09T18:01:14.395+0200 ... 0, null, null
为什么所有数据字段都是 null
或 0
?
当我从 SensorBeanRemote
切换到 SensorBeanLocal
时,它工作正常。
传感器实体:
@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;
...
}
这是我的第一个javaee项目,设计比较奇怪,请耐心等待
这看起来像是一个序列化问题。如果您使用 @Remote
接口,对象在被 EJB 返回之前被序列化(因为它期望在不同的服务器上),而使用 @Local
可以直接传递对象引用。
数据字段为空,因为 AbstractElement
不可序列化 - 在这种情况下,java 序列化机制将序列化 Sensor
class 中的字段,但是通过调用父级的无参数构造函数构造一个新的 superclass,这会将 superclass 的所有字段设置为其默认值。
要修复它,只需使 AbstractElement
实现 Serializable
。
My Java EE 7 CDI BackingBean,通过 EJB 从数据库中获取数据。 EJB 将正确的数据和 returns 列表(例如 3 项)获取到 BackingBean。 BackingBean 获得 3 个项目,但所有数据字段都是 0
或 null
.
BackingBean:
@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()+"]");
}
...
}
...
}
EJB:
@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;
}
}
在日志文件中我得到:
2015-10-09T18:01:14.094+0200 ... try to get sensors ...
2015-10-09T18:01:14.102+0200 ... try to load sensors from db ...
2015-10-09T18:01:14.384+0200 ... Found <3> sensors
2015-10-09T18:01:14.385+0200 ... 6, huette1, Sensor in der Huette 1
2015-10-09T18:01:14.385+0200 ... 8, huette2, Sensor 2 in Haus 1
2015-10-09T18:01:14.385+0200 ... 9, dfsdf, sdfsd]
2015-10-09T18:01:14.394+0200 ... got <3> sensors
2015-10-09T18:01:14.395+0200 ... 0, null, null
2015-10-09T18:01:14.395+0200 ... 0, null, null
2015-10-09T18:01:14.395+0200 ... 0, null, null
为什么所有数据字段都是 null
或 0
?
当我从 SensorBeanRemote
切换到 SensorBeanLocal
时,它工作正常。
传感器实体:
@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;
...
}
这是我的第一个javaee项目,设计比较奇怪,请耐心等待
这看起来像是一个序列化问题。如果您使用 @Remote
接口,对象在被 EJB 返回之前被序列化(因为它期望在不同的服务器上),而使用 @Local
可以直接传递对象引用。
数据字段为空,因为 AbstractElement
不可序列化 - 在这种情况下,java 序列化机制将序列化 Sensor
class 中的字段,但是通过调用父级的无参数构造函数构造一个新的 superclass,这会将 superclass 的所有字段设置为其默认值。
要修复它,只需使 AbstractElement
实现 Serializable
。