2013-10-30 175 views
0

我是Restful Web服務的新手。我想通過Jersey客戶端訪問服務器。但是我得到了500錯誤。我想要做的是通過客戶端提交一個表名,並以JSON的形式檢索表內容。任何人都可以在這裏找到錯誤?Jersey REST風格的服務,錯誤500

這是我的客戶端

public JSONObject loadTable(String tablename) throws ClientProtocolException, IOException { 
    pathParams.add("tablename", tablename); 
    JSONObject jsontable = service.path("access").path("loadtable").queryParams(pathParams).get(JSONObject.class); 
    return jsontable; 
} 

這是我的服務器端

@Path("/loadtable") 
@GET 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.TEXT_PLAIN) 
public JSONObject loadTable(@QueryParam("tablename") String tablename) throws Exception { 
    List<Pricing> pricing = new ArrayList<Pricing>(); 
    try { 
     query = c.prepareStatement("select * from '" + tablename + "'"); 
     ResultSet ets_rs = query.executeQuery(); 

     while (ets_rs.next()) { 
      pricing.add(new Pricing(ets_rs.getString(1), ets_rs.getString(2), ets_rs.getString(3), ets_rs.getString(4), ets_rs.getString(5), ets_rs.getString(6))); 
     } 
     query.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (c != null) { 
      c.close(); 
     } 
    } 
    JSONObject jsonTable = JsonConvert.getJsonFromPricing(pricing); 
    System.out.println(jsonTable); 
    return jsonTable; 
} 

在服務器端的定價類轉換的結果設定爲JSON。

這是堆棧跟蹤:

Exception in thread "AWT-EventQueue-0" com.sun.jersey.api.client.UniformInterfaceException: GET http://localhost:8080/ServerETS/resources/access/loadtable?tablename=prices returned a response status of 500 
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:563) 
    at com.sun.jersey.api.client.WebResource.get(WebResource.java:179) 
    at Link.ClientLink.loadTable(ClientLink.java:60) 
    at Interfaces.Pricing.loadTable(Pricing.java:112) 
    at Interfaces.Pricing.<init>(Pricing.java:32) 
    at Interfaces.MainMenu.panelPricing(MainMenu.java:1026) 
    at Interfaces.AdminData.btnAdminDataOKActionPerformed(AdminData.java:150) 
    at Interfaces.AdminData.access$000(AdminData.java:26) 
    at Interfaces.AdminData$1.actionPerformed(AdminData.java:70) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) 
    at java.awt.Component.processMouseEvent(Component.java:6288) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) 
    at java.awt.Component.processEvent(Component.java:6053) 
    at java.awt.Container.processEvent(Container.java:2041) 
    at java.awt.Component.dispatchEventImpl(Component.java:4651) 
    at java.awt.Container.dispatchEventImpl(Container.java:2099) 
    at java.awt.Component.dispatchEvent(Component.java:4481) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) 
    at java.awt.Container.dispatchEventImpl(Container.java:2085) 
    at java.awt.Window.dispatchEventImpl(Window.java:2478) 
    at java.awt.Component.dispatchEvent(Component.java:4481) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643) 
    at java.awt.EventQueue.access$000(EventQueue.java:84) 
    at java.awt.EventQueue$1.run(EventQueue.java:602) 
    at java.awt.EventQueue$1.run(EventQueue.java:600) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) 
    at java.awt.EventQueue$2.run(EventQueue.java:616) 
    at java.awt.EventQueue$2.run(EventQueue.java:614) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:613) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

這是GlassFish服務器日誌

Caused by: com.sun.jersey.api.MessageException: A message body writer for Java class org.json.simple.JSONObject, and Java type class org.json.simple.JSONObject, and MIME media type application/json was not found 
    ... 33 more 
+0

請包括更多細節。什麼是堆棧跟蹤? – 2013-10-30 16:20:46

+0

您是否也可以提供服務器日誌(應該還有一個例外,解釋導致HTTP 500的原因)? –

+0

@LutzHorn我已經包含了Stacktrace。 – Dimi

回答

0

改變了客戶端如下

public String loadTable(String tablename) throws ClientProtocolException, IOException { 
    pathParams.add("tablename", tablename); 
    ClientResponse response = service.path("access").path("loadtable").queryParams(pathParams).type(MediaType.APPLICATION_JSON).get(ClientResponse.class); 
    String responseString = response.getEntity(String.class); 
    return responseString; 
} 

和服務器端如下,

@Path("/loadtable") 
@GET 
@Produces(MediaType.APPLICATION_JSON) 
public List<Pricing> loadTable(@QueryParam("tablename") String tablename) throws Exception { 
    List<Pricing> pricing = new ArrayList<Pricing>(); 
    try { 
     query = c.prepareStatement("select * from " + tablename); 
     ResultSet ets_rs = query.executeQuery(); 

     while (ets_rs.next()) { 
      pricing.add(new Pricing(ets_rs.getString(1), ets_rs.getString(2), ets_rs.getString(3), ets_rs.getString(4), ets_rs.getString(5), ets_rs.getString(6))); 
     } 
     query.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (c != null) { 
      c.close(); 
     } 
    } 
    return pricing; 
} 

並註明定價與JAXB @XmlRootElement ... ,像變魔術一樣! 感謝@LutzHorn的評論!

0

既然你想發送請求數據作爲JSON格式,您可以修改MIME類型服務器消耗的數據類型爲JSON類型:

@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
+0

@tonga ...其實我的輸入不是JSON格式。它是純文本。只有我的輸出是JSON。 – Dimi

2

澤西島無法序列化您的響應JSONObject給JSON。你的方法更改爲這樣的事情:

@GET 
@Produces(MediaType.APPLICATION_JSON) 
public Response loadTable(@QueryParam("tablename") String tablename) throws Exception { 
    // ... 
    Pricing pricing = ... 
    return Response.ok(pricing).build(); 
} 

標註Pricing與JAXB @XmlRootElement,讓JAXB做轉化成JSON。

+0

感謝您的快速回復。但我仍然遇到同樣的錯誤。當我在「loadtable」方法頭下面添加s.out時,它不會給出任何結果。所以我猜錯誤是在客戶端方法調用或服務器端「可載入」方法頭。 – Dimi

相關問題