本人初学EJB,今天用EJB写了一个远程调用(连接数据库)的工程,结果各种错误,麻烦各位牛人看看。
实体bean的代码(数据库表的名字一一映射):
package cn.gt.bean;import java.io.Serializable;public class Product implements Serializable { private Integer id;
private String name;
private float price;
private int count;


public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}


}
远程接口:
package cn.gt.cart;import java.util.List;import javax.ejb.Remote;import cn.gt.bean.Product;@Remote
public interface CartRemote{ /**
 * 添加商品到购物车
 * @param goods
 */
public void addProduct(Product goods);
/**
 * 根据id删除购物车中的信息
 * @param id
 */
public void removeProduct(Integer id);
/**
 * 修改购物车中商品的信息
 * @param id
 */
public void updateProduct(Product product);
/**
 * 货物购物车中所有信息
 * @return
 */
public List<Product> getProducts(); public void test();

}实现远程接口的有状态bean:
package cn.gt.cart;import java.util.List;import javax.ejb.Stateful;import cn.gt.bean.Product;
import cn.gt.service.ProductService;@Stateful(mappedName = "product")
public class Cart implements CartRemote{ public void addProduct(Product goods) {

System.out.println("执行前");
int value=ProductService.insertProduct(goods);
if(value>0){
System.out.println("添加成功");
}else{
throw new RuntimeException("添加失败");
}
System.out.println("执行后");
} public List<Product> getProducts() {

List<Product> list=ProductService.getProducts();
return list;
} public void removeProduct(Integer id) {

int value=ProductService.deleteProduct(id);
if(value>0){
System.out.println("删除成功");
}else{
throw new RuntimeException("删除失败");
}
} public void updateProduct(Product product) {

int value=ProductService.updateProduct(product);
if(value>0){
System.out.println("修改成功");
}else{
throw new RuntimeException("修改失败");
}

}
public void test(){
System.out.println("ejb success");
}}连接数据库的代码:
package cn.gt.database;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public final class JDBconne 
{
    
  private static Connection connection = null;
  
      public static Connection getConnetion()
      {
          String url = "jdbc:mysql://localhost:3306/product?useUnicode=true&amp;characterEncoding=UTF-8";
          String user = "root";
          String password = "";                    try
                    {
                            // 注册驱动
                     DriverManager.registerDriver(new com.mysql.jdbc.Driver());
                            // 获得连接对象
                            connection = DriverManager.getConnection(url, user, password);
                    }
                    catch (Exception e)
                    {
                     e.printStackTrace();
                    }
                    return connection;
      }
      public static void closeConnection()
  {
try
{
if(connection != null) connection.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
 }
    
}
数据库的操作:
package cn.gt.service;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import cn.gt.bean.Product;
import cn.gt.database.JDBconne;public class ProductService { private static PreparedStatement ps;
private static ResultSet rs;
private static Connection ct;


public static int insertProduct(Product product) {
int value = 0;
String sql = "insert into goods values(?,?,?,?)";
ct = JDBconne.getConnetion();
try {
ps = ct.prepareStatement(sql);
ps.setInt(1, product.getId());
ps.setString(2, product.getName());
ps.setFloat(3, product.getPrice());
ps.setInt(4, product.getCount());
System.out.println("insert into"+sql);
value = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
} return value;
}


public static int deleteProduct(Integer id){
int value = 0;
String sql = "delete from goods where id=?";
ct = JDBconne.getConnetion();
try {
ps = ct.prepareStatement(sql);
ps.setInt(1, id);
value = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
return value;
}

public static int updateProduct(Product product){
int value = 0;
String sql = "update goods set name=?,float=?,count=? where id=?";
ct = JDBconne.getConnetion();
try {
ps = ct.prepareStatement(sql);
ps.setString(1, product.getName());
ps.setFloat(2, product.getPrice());
ps.setInt(3, product.getCount());
ps.setInt(4, product.getId());
value = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
} return value;

}

public static List<Product> getProducts(){
ArrayList<Product> list = new ArrayList<Product>();
String sql = "select * from person";
ct = JDBconne.getConnetion();
try {
ps = ct.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
Product product = new Product();
product.setId(rs.getInt("id"));
product.setName(rs.getString("name"));
product.setPrice(rs.getFloat("price"));
product.setCount(rs.getInt("count"));
list.add(product);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
return list;
}

public static void close() {
try {
if (rs != null) {
rs.close();
rs = null;
}
if (ps != null) {
ps.close();
ps = null;
}
if (ct != null) {
JDBconne.closeConnection();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
连接数据库是正确的,用junit测试过。简单测试的客户端:package cn.gt.test;import java.io.Serializable;
import java.util.Hashtable;import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;import cn.gt.bean.Product;
import cn.gt.cart.CartRemote;public class test{ /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
Context ctx;
try {
  //ctx = new InitialContext(); //创建上下文环境
  
  Hashtable<String, String> ht = new Hashtable<String, String>();     
ht.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
ht.put("java.naming.provider.url", "localhost:1099");
ctx = new InitialContext(ht); //创建上下文环境

      CartRemote cart = (CartRemote) ctx.lookup("product");
      if(cart!=null){
        //简单测试一下cart是否为空
           System.out.println(cart.hashCode()+cart.getClass().getName());
      }
      Product product = new Product();
      product.setId(3);
      product.setName("xiaojiao");
      product.setPrice(53.14f);
      product.setCount(15);
      
      /**调用ejb方法**/
      cart.addProduct(product);
      System.out.print("等待");     } catch (NamingException ne) {
     System.out.println("Not connect JBoss server on " + Context.PROVIDER_URL);
            //ex.printStackTrace();
        }  catch (Exception ex) {
         System.out.println(ex.getMessage());
        }
}}
测试结果
log4j:WARN No appenders could be found for logger (org.jnp.interfaces.TimedSocketFactory).
log4j:WARN Please initialize the log4j system properly.
-1566496162$Proxy3
java.io.InvalidClassException: cn.gt.bean.Product; cn.gt.bean.Product; class invalid for deserialization
这是什么错误,关于java中序列化和反序列化,麻烦各位牛人指点。小弟在此先谢过了。EJB remote

解决方案 »

  1.   

    首先,你对EJB实体BEAN理解不正确,实体BEAN是直接与数据库进行交互的。
    你所写的javaBean看不出与数据库有任何关系。应该是类似hibernate的ORMaping。
    1.设置表中字段映射时,需要在javabean的get方法中设置相应标签。
    2.对于数据的保存,可以在服务器中配置数据源。利用hibernate操作数据库。
    3.当然从你的代码可以看出,是利用sql语句进行数据操作的。但此时你操作的对象并不是一个实体bean,只是一个简单的java对象。javaBean应该显示实现一个默认的构造函数。可以参考http://blog.csdn.net/sunquan291/article/details/8870349
      

  2.   


    实体bean本来应该有JPA来完成,但是学习EJB时还没有学习JPA,这只是个EJB实验。我看了你的帖子,你是通过手动配置数据源来和数据库映射,当然如果加上持久层框架实现起来就不一样了。不过后来说也奇怪,我把JBoss卸掉重新装了一次,竟然可以了,我就很郁闷,难道是jboss出问题了!