简体   繁体   中英

Rich client (swing) application which connects to Remote database over http

i have a local client j2se application and backend is derby(javadb) database and dao is jpa eclipselink . how do i send these database pojo to a remote database which linked with spring ( jsp) application on tomcat server

simply this is a rich client with swing which connects to tomcat deployed web application. The client should receive data and send data through HTTP requests to the server-side of the service, what would be the best solution ??

01) direct database connection/transaction through socket using Eclipselink 02) web service ?? 03) just send post request to spring web application and convert it to POJO and persist to database

how do i achieve this??

DISCLAIMER I am not suggesting you port your app from Spring to EJB. Despite how people like to compare them as exclusively one or the other, you can use them both. Its your app, you can be as pragmatic as you want to be :)

You don't necessarily have to use Web Services if you wanted. You could drop the OpenEJB war file into Tomcat as well and create an Remote EJB to send data back and forth.

Once you drop in OpenEJB you can put a remote @Stateless bean in your app like so:

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

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

Then look it up and execute it over HTTP from your Swing app like so:

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");

Client-side all you need are the openejb-client.jar and javaee-api.jar from the OpenEJB war file and your own classes.

Since it's already a Spring app don't bother trying to use @PersistenceContext to get a reference to the EntityManager so the EJB can use it. Just figure out how to expose the EntityManagerFactory that Spring creates (or you create) to the EJB via any means possible. The direct and ugly, but effective, approach would be a static on the MyBean class and a bit of startup logic that sets it. You'd just be using the EJB for remoting so no need for fancier integration.

If you did really need web services for non-java communication or something, you can add @WebService to the top of your bean and then it will have WSDL and all that generated for it:

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

Then you can also use the same bean as a web service like:

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);

Both approaches are over http, but the web service approach will be a bit slower as it isn't a binary protocol.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM