富客户端(swing)应用程序,通过http连接到远程数据库

时间:2011-05-19 06:20:34

标签: web-services http java-ee java

我有一个本地客户端j2se应用程序,后端是derby(javadb)数据库,dao是jpa eclipselink。 我如何将这些数据库pojo发送到与tomcat服务器上的spring(jsp)应用程序链接的远程数据库

这只是一个带有swing的富客户端,它连接到tomcat部署的Web应用程序。客户端应该接收数据并通过HTTP请求将数据发送到服务的服务器端, 什么是最好的解决方案??

01)使用Eclipselink通过套接字直接进行数据库连接/事务 02)网络服务?? 03)只需将帖子请求发送到spring web应用程序并将其转换为POJO并持久保存到数据库

我如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

免责声明建议您将应用从Spring迁移到EJB。尽管人们喜欢将它们作为一种或另一种进行比较,但您可以同时使用它们。它是你的应用程序,你可以像你想要的那样务实:)

如果您愿意,您不一定要使用Web服务。您也可以将OpenEJB war文件放入Tomcat,并创建一个远程EJB来来回发送数据。

一旦你进入OpenEJB,你可以在你的应用程序中放置一个远程@Stateless bean,如下所示:

@Stateless
@Remote
public class MyBean implements MyBeanRemote {
    //...
}

public interface MyBeanRemote {
   // any methods you want remotely invoked
}

然后查找并通过Swing应用程序通过HTTP执行它,如下所示:

Properties p = new Properties();
p.put("java.naming.factory.initial", "org.apache.openejb.client.RemoteInitialContextFactory");
p.put("java.naming.provider.url", "http://tomcatserver:8080/openejb/ejb");
// user and pass optional
p.put("java.naming.security.principal", "myuser");
p.put("java.naming.security.credentials", "mypass");

InitialContext ctx = new InitialContext(p);

MyBean myBean = (MyBean) ctx.lookup("MyBeanRemote");

客户端所需要的只是OpenEJB war文件中的openejb-client.jar和javaee-api.jar以及您自己的类。

因为它已经是一个Spring应用程序,所以不要试图使用@PersistenceContext来获取对EntityManager的引用,以便EJB可以使用它。只是弄清楚如何通过任何可能的方式公开Spring创建(或创建)EJB的EntityManagerFactory。直接和丑陋但有效的方法将是MyBean类的静态和一些设置它的启动逻辑。您只需使用EJB进行远程处理,因此无需进行更高级的集成。

如果您确实需要用于非Java通信的Web服务,您可以将@WebService添加到bean的顶部,然后它将具有WSDL以及为其生成的所有内容:

@Stateless
@Remote
@WebService(portName = "MyBeanPort",
    serviceName = "MyBeanService",
    targetNamespace = "http://superbiz.org/wsdl"
    endpointInterface = "org.superbiz.MyBeanRemote")
public class MyBean implements MyBeanRemote {
    //...
}

public interface MyBeanRemote {
   // any methods you want remotely invoked
}

然后您也可以使用相同的bean作为Web服务,如:

Service service = Service.create(
        new URL("http://tomcatserver:8080/MyBeanImpl?wsdl"),
        new QName("http://superbiz.org/wsdl", "MyBeanService"));
assertNotNull(service);

MyBeanRemote myBean = service.getPort(MyBeanRemote.class);

这两种方法都是通过http,但Web服务方法会慢一点,因为它不是二进制协议。