2

現在、Netbeans(エンティティクラスウィザードのセッションBean)によって自動生成されたファサードでビジネスメソッドを呼び出すことにより、スタンドアロンクライアントからサーバーエンタープライズアプリケーションに@Entityオブジェクトを渡そうとしています。

@Entityクラスは、2つのStringフィールドで構成されています。しかし、オブジェクトがサーバー側に到着すると、すべてのフィールドが「null」になります。ただし、ファサードのリモートメソッドを呼び出す前に、クライアント側でエンティティオブジェクトを正しく初期化してから、オブジェクトをMySQLデータベースに格納する必要があります。実際には保存されていますが、それらのnull参照が含まれています)。エラーはなく、@Entityオブジェクトをクライアントからサーバーに渡す以外はすべて正常に機能します。

逆の方法が機能します。テーブルに手動で行を追加し、ファサードのリモートビジネスメソッドfind(Object id)を呼び出して、dbのエントリをクライアントに戻しました。マーシャリングは、この方向で問題なく機能します。

基本的に、3つのプロジェクトで構成されています(下部にクラスが添付されています)。

  1. Enterprise-App / EJB:MySQLへのファサードとJDBC接続の実装を保持します
  2. Java Class-Library:リモートビジネスメソッドとエンティティBeanのインターフェイスを保持します(これはサーバー側とクライアント側で共有(参照)されます)
  3. Javaアプリケーション:InitialContextを構築し、JNDIルックアップを実行して、ファサードのリモートビジネスメソッドへの参照を取得します

私は今この問題に2日間直面しており、誰も解決方法の手がかりを持っていません。インターネット検索は完全に失敗しました。したがって、どんなアイデアも高く評価されます-事前に感謝します!

どんなアイデアでも高く評価されます。

A1)EJB / Enterprise-App:抽象ファサードクラス(Netbeansによって自動生成)は次のとおりです。

public abstract class AbstractFacade<T> {
    private Class<T> entityClass;

    public AbstractFacade(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    protected abstract EntityManager getEntityManager();

    public void create(T entity) {
        getEntityManager().persist(entity);
    }

    public void edit(T entity) {
        getEntityManager().merge(entity);
    }

    public void remove(T entity) {
        getEntityManager().remove(getEntityManager().merge(entity));
    }

    public T find(Object id) {
        return getEntityManager().find(entityClass, id);
    }
}

A2)EJB / Enterprise-App:ファサードの実装(Netbeansによって自動生成):

@Stateless
public class UserFacade extends AbstractFacade<User> implements UserFacadeRemote {

    @PersistenceContext(unitName = "LawSuiteEE-ejbPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public UserFacade() {
        super(User.class);
    }

}

B1)共有クラス-ライブラリ:エンティティクラスは次のとおりです。

@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;
    }

}

B2)共有クラスライブラリ:リモートファサードインターフェイス:

@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();
    }

}
4

1 に答える 1

6

私の推測では、これは定義したserialVersionUID、または使用しているCORBAシリアライザーに関連していると思います。通常のRMIを試すことができるかどうかわからない。クライアント上でオブジェクトをシリアル化/逆シリアル化してみてください、それは機能しますか?また、サーバー上で試してみてください。

私の推測では、クライアントとサーバーのクラスバージョンはどういうわけか異なっています。これは、JPAがサーバー上のクラスをどのように織り込むかに関連している可能性があります。persistence.xmlでウィービングを無効にしてみてください。これで問題は解決しますか?

含まれている場合は、jarの静的ウィービングを使用してみて、クライアントとサーバーの両方が同じjarを共有するようにします。

どのバージョンのGlassfishとJDKを使用していますか?GlassfishのクライアントからリモートセッションBeanを呼び出す同様のテストがあり、問題はありません。

于 2012-04-18T12:53:06.247 に答える