使用Jersey的REST Web服务的Jena API

时间:2013-10-18 09:59:21

标签: rest tomcat jersey jena

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

我的webservice的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代码和这个主要方法代码中完全没有区别)如果我在一个普通的java类中编写并运行它的main方法,我得到36个结果。我不确定是什么问题。

请帮助我。

1 个答案:

答案 0 :(得分:0)

您需要将问题分开:

  1. 将服务逻辑 - 实际查询Allegro图形的位 - 移动到一个单独的类,以便正确封装。该类的API应该反映其在您的应用程序中的职责,而不是它当前正在工作的方式。
  2. 为服务类编写JUnit测试。这很重要 - 它让您确信您的服务正确地执行其工作,并在您开发应用程序时继续这样做。
  3. 编写Jersey方法以调用符合服务类API的任何服务对象。
  4. 编写一个或多个HTTPUnit(或类似)测试以调用REST API。理想情况下,您将使用模拟或测试双重而不是实际服务。您要测试的是HTTP请求是否到达正确的方法,并且该方法使用正确的参数委托给服务对象。然后,您正在测试(并调试!)少量的问题。
  5. 使用小功能单元并明确其职责是更好的。你肯定应该学习如何使用测试 - 这在中期内是一个巨大的胜利,即使它意味着更多的学习前面!