1

我正在使用 Jena API 从 Allegrograph Server 获取 RDF 数据。我已经使用 Jersey jar 编写了一个 REST Web 服务来获取这些数据。

我的 web 服务的 java 代码如下所示:

@GET
@Path("/JENA")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public String getData() throws RepositoryException {
    AGGraphMaker maker = new AGGraphMaker(conn);
    AGGraph graph = maker.getGraph();
    AGModel model = new AGModel(graph);
    AGQuery agQuery = AGQueryFactory.create(query);
    QueryExecution qe = AGQueryExecutionFactory.create(agQuery, model);

    String result = null;

    ByteArrayOutputStream byteArrayOutputStream = null;

try {
       ResultSet rs = qe.execSelect();
       While(rs.hasNext()){
         byteArrayOutputStream = new ByteArrayOutputStream();
         if("JSON".equalsIgnoreCase(outputFormat)){
           ResultSetFormatter.outputAsJSON(byteArrayOutputStream, rs);
           result = byteArrayOutputStream.toString();
           System.out.println("Result is "+result);
         } else if("XML".equalsIgnoreCase(outputFormat)){
           ResultSetFormatter.outputAsXML(byteArrayOutputStream, rs);
           result = byteArrayOutputStream.toString();
         }else if("CSV".equalsIgnoreCase(outputFormat)){
           ResultSetFormatter.outputAsCSV(byteArrayOutputStream, rs);
           result = byteArrayOutputStream.toString();
        }
     }
} catch (Exception e) {
    System.out.println(e.getMessage());
}
 } 

当我在 Tomcat 服务器上部署此 Web 服务并在 Chrome 和 firefox 上使用 REST 客户端应用程序对其进行测试时,我没有得到 SPARQL 查询的结果。

但是相同的代码(webservice 代码和这个 main 方法代码绝对没有区别)如果我用一个普通的 java 类编写并运行它的 main 方法,我会得到 36 个结果。我不确定问题是什么。

请在这方面帮助我。

4

1 回答 1

0

您需要分离关注点:

  1. 将服务逻辑(实际查询 Allegro 图的位)移至单独的类,以便正确封装。类的 API 应该反映它在您的应用程序中的职责,而不是它目前的工作方式。
  2. 为服务类编写 JUnit 测试。这很重要——它让您确信您的服务正在正确地执行其工作,并在您开发应用程序时继续这样做。
  3. 编写 Jersey 方法来调用任何符合服务类 API 的服务对象。
  4. 编写一个或多个 HTTPUnit(或类似的)测试来调用您的 REST API。理想情况下,您将使用模拟或测试替身而不是实际服务。您要测试的是 HTTP 请求是否到达正确的方法,并且该方法使用正确的参数委托给服务对象。然后,您正在测试(和调试!)较少数量的关注点。

使用小型功能单元并清楚地了解其职责会更好。而且你绝对应该学会使用测试 - 从中​​期来看,这是一个巨大的胜利,即使这意味着更多的学习!

于 2013-10-18T10:25:24.660 回答