【问题标题】:How to connect EJB, REST and Client?如何连接 EJB、REST 和客户端?
【发布时间】:2015-09-16 16:56:19
【问题描述】:

我在 netbeans 中有 2 个 java 项目,我想连接它们。首先是基于 Jboss 服务器,包含 ejb 和 rest。 EJB 与数据库连接,其余服务包对象到 xml 并发送到客户端,这是标准的基于 swing 的 gui 应用程序。问题是我不知道下一步该做什么,因为当我尝试从服务器接收任何数据时出现空指针异常。我做得对吗?也许我的整个想法是错误的?请帮忙。

编辑: 我认为故障出在服务器端。我不知道如何创建休息服务。在 netbeans 的 WholesaleREST 类中,警告说没有配置休息。我单击“使用 Java EE6 规范配置 REST”,服务器无法部署它并抛出错误:

Deployment "vfs:///E:/Instalki/jboss/jboss-as-distribution-6.1.0.Final/jboss-6.1.0.Final/server/default/deploy/WholesaleApp.war" is in error due to the following reason(s): org.jboss.deployers.spi.DeploymentException: URL file:/E:/Instalki/jboss/jboss-as-distribution-6.1.0.Final/jboss-6.1.0.Final/server/default/tmp/vfs/automount6dbf7312f2f10b36/WholesaleApp.war-1ad4d6611c73bd02/ deployment failed

这个错误没有告诉我任何关于它的信息,我不知道该怎么做。请问有什么想法吗?

添加的文字结束,下面的其余部分是旧的。

这是我写的代码:

EJB 类:

@Stateless
public class WholesaleEJB {

    @PersistenceContext(name="WholesaleAppPU")
    EntityManager entityManager;

    public List<Clients> getClients() {
        Query q = entityManager.createQuery("select c from Clients c");
        @SuppressWarnings("unchecked")
        List<Clients> lista = q.getResultList();
        return lista;
    }

}

休息课:

@Path("/wholesale")
@Stateless
public class WholesaleREST implements WholesaleInterface{

    @EJB
    WholesaleEJB bean;

    @Override
    @GET
    @Path("/get")
    public String getCars() {
        List<Clients> listOfClients = bean.getClients();
        StringWriter sw = new StringWriter();
        ClientsContainer container = new ClientsContainer(listOfClients);
        JAXB.marshal(container, sw);
        return sw.toString();
    }
}

带有get方法的客户端类

public class HttpConnector {

    public static String doGet(String url) {
        try {
            URLConnection connection = new URL(url).openConnection();
            String charset = "UTF-8";
            connection.setRequestProperty("Accept-Charset", charset);
            return getResponse(connection);
        } catch (Exception ex) {
            ex.getMessage();
        }
        return null;
    }

    private static String getResponse(URLConnection connection) 
           throws UnsupportedEncodingException, IOException {
        InputStream response = connection.getInputStream();
        final char[] buffer = new char[0x10000];
        StringBuilder out = new StringBuilder();
        Reader in = new InputStreamReader(response, "UTF-8");
        int read;
        do {
            read = in.read(buffer, 0, buffer.length);
            if (read>0) {
                out.append(buffer, 0, read);
            }
        } while (read>=0);

        return out.toString();
    }

}

最后一个从客户端访问 ejb 方法的类:

public class ClientRemoteAccess implements ClientInterface{

String url = "http://localhost:8080/WholesaleApp/wholesale";

    @Override
    public List<Clients> getClients() {
        String recivedXML = HttpConnector.doGet(url+"/get");
        ClientsContainer container = JAXB.unmarshal(
             new StringReader(recivedXML), ClientsContainer.class);
        return container.getListOfClients();
    }  
}

【问题讨论】:

标签: java rest jakarta-ee jboss


【解决方案1】:

我认为你想要实现的架构是这样的:

  1. common-model:在这里放置领域模型,例如 JPA 实体和类 ClientsContainer
  2. restfull-service:依赖于common-model,包含与数据库通信的 EJB/JPA 层和将数据公开为资源的 RESTful Web 服务。李>
  3. restful-client:依赖于common-model并通过HTTP与restfull-service通信的swing富客户端。

请注意,EJB 和客户端之间没有直接通信。

【讨论】:

  • 我知道这个结构和我的代码是基于它的。我只是想知道我的代码有什么问题以及为什么它不起作用
  • 如果您认为架构很好,但您的代码仍然无法正常工作,请将您编写的 restful 客户端与我在之前评论中指出的示例中提供的客户端进行比较。看来您正在将网址 localhost:8080/WholesaleApp/wholesale 修改为此 localhost:8080/WholesaleApp/wholesale/get ,这是正确的吗?
猜你喜欢
  • 2017-09-28
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2023-04-09
  • 2016-05-17
相关资源
最近更新 更多