2016-08-19 200 views
3

我是新來的Java,澤西島和RESTful。我最近下載了Jersey jar 2.23.2和Jersey media moxy 2.23.2以及java-json庫。REST風格的JSON與澤西島2.23.2

我在谷歌中看到很多例子,但大多都是不同的。沒有一個確切的例子可以遵循。我試圖做到這一點,但仍然不知道如何使用http客戶端來獲取方法。我發佈了下面的代碼。

此外,我用郵遞員來測試編碼的方法,但我在post方法上出現錯誤。

SEVERE: Servlet.service() for servlet [Service] in context with path [/com.myexample] threw exception [org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: javax/json/JsonException] with root cause 
java.lang.ClassNotFoundException: javax.json.JsonException 

這些都是庫

enter image description here

這是我的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 
     <display-name>com.myexample</display-name> 
     <welcome-file-list> 
     <welcome-file>default.html</welcome-file> 
     </welcome-file-list> 

     <servlet> 
     <servlet-name>Service</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>jersey.config.server.provider.packages</param-name> 
      <param-value>com.myexample.resources<param-value> 
     </init-param> 
     <init-param> 
      <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
      <param-value>true</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
     </servlet> 
     <servlet-mapping> 
     <servlet-name>Service</servlet-name> 
     <url-pattern>/api/*</url-pattern> 
     </servlet-mapping> 
    </web-app> 

這是我創建的類:

public class Employee { 

    private String firstName; 
    private String lastName; 

    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    @Override 
    public String toString() { 
     return this.firstName + " " + this.lastName; 
    } 

} 

這是控制器/資源

package com.myexample.resources; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

import org.json.JSONException; 
import org.json.JSONObject; 

@Path("/test") 
public class MyResource { 


    @GET 
    @Path("getEmployee") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response getEmployee() throws JSONException{ 
     Employee employee = new Employee(); 
     employee.setFirstName("John"); 
     employee.setLastName("Smith"); 
     JSONObject json = new JSONObject(); 
     json.put("employee", employee); 
     return Response.status(200).entity(employee).build(); 
    } 


    @POST 
    @Path("postEmployee") 
    @Consumes(MediaType.APPLICATION_JSON) 
    public Response postEmployee(Employee employee) throws JSONException{ 
     return Response.status(200).entity(employee.toString()).build(); 
    } 
} 

我試圖創建我的HTTP客戶端

public class TestClient { 

     public static void main(String[] args) { 
      try { 
       //POST 
       Client client = ClientBuilder.newClient(); 
       WebTarget webTarget = client.target("http://localhost:8080/com.myexample/api/test/postEmployee"); 
       Employee emp = new Employee(); 
       emp.setFirstName("John"); 
       emp.setLastName("Smith"); 


       Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON); 
       //<--As it crashes the following line of this comment, I still don't know how to get my entity 
       Response response = invocationBuilder.post(Entity.entity(emp, MediaType.APPLICATION_JSON)); 
       //Employee emp = readEntity(Employee.class); //??? 
       } catch (Exception e) { 
       e.printStackTrace(); 
       } 

      //GET 
      try { 
       Client client = ClientBuilder.newClient(); 
       WebTarget webTarget = client.target("http://localhost:8080/com.myexample/api/test/getEmployee"); 
       Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON); 
       Response response = invocationBuilder.get(); 
       //I get my response but how to deserialize the object 
       //Employee emp = (Employee)response.getEntity(); //CRASH, cannot cast    
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

} 

正如我還是不知道如何找回我的客戶端上的對象,但我用郵差測試控制器。

這是get方法與郵遞員的輸出。它的工作原理

enter image description here

這是從POST方法與郵差輸出。它不工作

enter image description here

這是完全錯誤

Aug 18, 2016 11:37:59 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [Service] in context with path [/com.myexample] threw exception [org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: javax/json/JsonException] with root cause 
java.lang.ClassNotFoundException: javax.json.JsonException 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1313) 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1164) 
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.getNewXMLReader(SAXUnmarshaller.java:200) 
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.getXMLReader(SAXUnmarshaller.java:188) 
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:425) 
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:375) 
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:708) 
    at org.eclipse.persistence.internal.oxm.XMLUnmarshaller.unmarshal(XMLUnmarshaller.java:643) 
    at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:339) 
    at org.eclipse.persistence.jaxb.rs.MOXyJsonProvider.readFrom(MOXyJsonProvider.java:660) 
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:256) 
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:235) 
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155) 
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:74) 
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155) 
    at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1085) 
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874) 
    at org.glassfish.jersey.server.ContainerRequest.readEntity(ContainerRequest.java:271) 
    at org.glassfish.jersey.server.internal.inject.EntityParamValueFactoryProvider$EntityValueFactory.provide(EntityParamValueFactoryProvider.java:96) 
    at org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.provide(ParamValueFactoryWithSource.java:71) 
    at org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:94) 
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:127) 
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) 
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) 
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) 
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) 
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473) 
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1527) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1484) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Unknown Source) 
+1

鮃,你能在這裏包含的參考實現罐子:https://jsonp.java.net/download.html,然後再試一次。 –

+2

將http://www.java2s.com/Code/Jar/j/Downloadjavaxjson10jar.htm添加到您的庫中 –

+0

感謝您的評論球員。非常感激。幾乎差不多!我做了你所說的Ebrahim Pasbani,因爲我不使用Maven。現在,Tomcat不會崩潰,但我得到錯誤「HTTP狀態400 - 錯誤請求。客戶端發送的請求在語法上不正確。」 –

回答

0

您需要追捕的球衣,媒體麼的正確依賴。使用https://jar-download.com/來尋找依賴關係,儘管最好使用Maven從現在開始是最好的嗎?

對版本號非常具體。

0

Documentation

被搜索到的類定義時,當前執行的 類被編譯,但定義可以不再被發現存在。

所以,當你建立你的戰爭時,缺少的依賴關係並沒有與它打包在一起。

您開始的更好選擇是使用Maven。從原型創建一個Maven項目。

這裏是如何建立的REST API很簡單的指南, REST API EXAMPLE