Serialization 爪哇及;EJB3:如何正确地将@Entity对象从客户端传递到服务器?
我目前正试图通过调用由Netbeans(实体类会话bean向导)自动生成的外观上的业务方法,将@Entity对象从独立客户端传递到服务器企业应用程序 @Entity类由两个字符串字段组成。但是当对象到达服务器端时,所有字段都是“null”,尽管在调用facade的远程方法之前,我在客户端正确地初始化了entity对象,而facade应该将对象存储到我的MySQL数据库中(事实上,它是存储的,但是带有那些null引用)。没有错误,除了将@Entity对象从客户端传递到服务器之外,其他一切都正常工作 反之亦然。我在表中手动添加了一行,并调用facade的远程业务方法find(objectid),以便将db条目返回给客户端。编组在这个方向上工作得很好 基本上,它由3个项目组成(类附在底部):Serialization 爪哇及;EJB3:如何正确地将@Entity对象从客户端传递到服务器?,serialization,jpa,ejb,entity,rmi,Serialization,Jpa,Ejb,Entity,Rmi,我目前正试图通过调用由Netbeans(实体类会话bean向导)自动生成的外观上的业务方法,将@Entity对象从独立客户端传递到服务器企业应用程序 @Entity类由两个字符串字段组成。但是当对象到达服务器端时,所有字段都是“null”,尽管在调用facade的远程方法之前,我在客户端正确地初始化了entity对象,而facade应该将对象存储到我的MySQL数据库中(事实上,它是存储的,但是带有那些null引用)。没有错误,除了将@Entity对象从客户端传递到服务器之外,其他一切都正常工作
@Remote
public interface UserFacadeRemote {
void create(User user);
void edit(User user);
void remove(User user);
User find(Object id);
}
C) 客户端Java应用程序:
public class LawSuiteSE {
private static UserFacadeRemote ctrlUser;
public LawSuiteSE() {
try {
Properties props = new Properties();
props.put("org.omg.CORBA.ORBInitialHost", "192.168.1.6");
props.put("org.omg.CORBA.ORBInitialPort", "3700");
InitialContext ctx = new InitialContext(props);
ctrlBenutzer = (BenutzerFacadeRemote)ctx.lookup("java:global/LawSuiteEE/LawSuiteEE-ejb/UserFacade!control.UserFacadeRemote");
User user1 = new User();
user1.setUsername("testusr");
user1.setPassword("testpwd");
ctrlUser.create(user1);
User user2 = ctrlUser.find(1L);
System.out.println("username: "+user2.getUsername());
System.out.println("password: "+user2.getPassword());
} catch (NamingException ex) {
System.err.println(ex.getMessage());
}
}
public static void main(String[] args) {
LawSuiteSE lsse = new LawSuiteSE();
}
}
我猜它与您定义的serialVersionUID或您正在使用的CORBA序列化程序有关。不确定您是否可以尝试常规RMI。尝试仅在客户端上序列化/反序列化对象,是否有效?也可以在服务器上尝试 我猜客户端和服务器中的类版本在某种程度上是不同的。这很可能与JPA如何在服务器上编织类有关。尝试在persistence.xml中禁用编织,这能解决问题吗 如果是这样,那么尝试使用jar的静态编织,这样客户机和服务器都共享同一个jar
您使用的是什么版本的Glassfish和JDK?我们有类似的测试,从Glassfish中的客户端调用远程会话bean,它们没有任何问题。Hi barsju-我在初始消息中将实体代码发布为edit。。。我真的很沮丧。我花了整整一周的时间正确设置GlassFish服务器,以便与ACC进行远程通信,现在这个问题又出现了两天:-(我在互联网上找不到任何信息..非常奇怪,你能将一个对象从服务器序列化到客户端吗?如果你删除serialVersionUID怎么办?会话bean代码怎么办?实体是否保存在数据库中?顺便说一句,AFAIK MySql不支持序列生成策略。请参阅.hi waclaw-我的示例I中的会话bean代码s用@Stateless注释的UserFacade类。是的,实体在数据库中保持不变,但使用“null”用户名和密码字段的值。好的,谢谢关于顺序策略的提示,我暂时切换到自动。还有什么想法吗?嗨,詹姆斯-在persistence.xml中禁用编织完成了!!!非常非常感谢!我在Ubuntu11.10和JDK1.6.030上使用GlassFish 3.1.2。那么,我如何使用静态编织呢静态编织的eclipse链接:您是否尝试删除serialVersionUID并保持编织启用?对结果感兴趣。@詹姆斯:我在通过entityDetail列表时面临类似的问题。我使用的是Glassfish v2.1和JDK 1.6。但是Glassfish v3.1.2没有出现此问题!出于某些原因,我无法切换到更新的Glassfish。可以吗你能给我一些建议吗?谢谢
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String username;
private String password;
public User() { }
public User(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
@Remote
public interface UserFacadeRemote {
void create(User user);
void edit(User user);
void remove(User user);
User find(Object id);
}
public class LawSuiteSE {
private static UserFacadeRemote ctrlUser;
public LawSuiteSE() {
try {
Properties props = new Properties();
props.put("org.omg.CORBA.ORBInitialHost", "192.168.1.6");
props.put("org.omg.CORBA.ORBInitialPort", "3700");
InitialContext ctx = new InitialContext(props);
ctrlBenutzer = (BenutzerFacadeRemote)ctx.lookup("java:global/LawSuiteEE/LawSuiteEE-ejb/UserFacade!control.UserFacadeRemote");
User user1 = new User();
user1.setUsername("testusr");
user1.setPassword("testpwd");
ctrlUser.create(user1);
User user2 = ctrlUser.find(1L);
System.out.println("username: "+user2.getUsername());
System.out.println("password: "+user2.getPassword());
} catch (NamingException ex) {
System.err.println(ex.getMessage());
}
}
public static void main(String[] args) {
LawSuiteSE lsse = new LawSuiteSE();
}
}