2017-09-25 89 views
-1

我很新的Java和REST API,我有以下問題。我遵循鏈接https://www.tutorialspoint.com/restful/restful_first_application.htm來了解如何構建REST API。我嘗試了一些東西,我想用我自己的包(com.ca),並更新了我的web.xml以下幾點:REST API的Java:拋出java.lang.ClassNotFoundException:com.tutorialspoint.User

<?xml version = "1.0" encoding = "UTF-8"?> 
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
    xmlns = "http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    id = "WebApp_ID" version = "3.0"> 
    <display-name>User Management</display-name> 
    <servlet> 
     <servlet-name>Jersey RESTful Application</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.ca</param-value> 
     </init-param> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Jersey RESTful Application</servlet-name> 
     <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

然而,當我嘗試在服務器上重新運行代碼,做一個GET請求我得到如下:此外,如果你有一些有用的鏈接

java.lang.ClassNotFoundException: com.tutorialspoint.User 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1892) 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1735) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:348) 
    at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:677) 
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1826) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1713) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2000) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 
    at java.util.ArrayList.readObject(ArrayList.java:791) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1058) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2136) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2027) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 
    at com.ca.UserDao.getAllUsers(UserDao.java:28) 
    at com.ca.UserService.getUsers(UserService.java:16) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:76) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:148) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:191) 
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:243) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:103) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:493) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:415) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:104) 
    at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:272) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:268) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:316) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:298) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:268) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:289) 
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256) 
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:703) 
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:416) 
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:370) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:389) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:342) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:229) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:748) 

它似乎仍指向上一包(一個用於運動),但我找不到爲什麼...關於它(如何設置web.xml,每個標籤角色......),這也會有所幫助。

在此先感謝。

UPDATE: 下面是源文件: User.java:

package com.ca; 

import java.io.Serializable; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
@XmlRootElement(name = "user") 

public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private int id; 
    private String name; 
    private String profession; 
    public User(){} 

    public User(int id, String name, String profession){ 
     this.id = id; 
     this.name = name; 
     this.profession = profession; 
    } 
    public int getId() { 
     return id; 
    } 
    @XmlElement 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    @XmlElement 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getProfession() { 
     return profession; 
    } 
    @XmlElement 
    public void setProfession(String profession) { 
     this.profession = profession; 
    } 
} 

UserDao.java:

package com.ca; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.util.ArrayList; 
import java.util.List; 

public class UserDao { 
    public List<User> getAllUsers(){ 

     List<User> userList = null; 
     try { 
     File file = new File("Users.dat"); 
     if (!file.exists()) { 
      User user = new User(1, "Mahesh", "Teacher"); 
      userList = new ArrayList<User>(); 
      userList.add(user); 
      saveUserList(userList); 
     } 
     else{ 
      FileInputStream fis = new FileInputStream(file); 
      ObjectInputStream ois = new ObjectInputStream(fis); 
      userList = (List<User>) ois.readObject(); 
      ois.close(); 
     } 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
     } 
     return userList; 
    } 
    private void saveUserList(List<User> userList){ 
     try { 
     File file = new File("Users.dat"); 
     FileOutputStream fos; 
     fos = new FileOutputStream(file); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     oos.writeObject(userList); 
     oos.close(); 
     } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
    }  
} 

UserService.java:

package com.ca; 

import java.util.List; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
@Path("/UserService") 

public class UserService { 
    UserDao userDao = new UserDao(); 
    @GET 
    @Path("/users") 
    @Produces(MediaType.APPLICATION_XML) 
    public List<User> getUsers(){ 
     return userDao.getAllUsers(); 
    } 
} 

更新2.0: Screenshot of the project folder

現在我有以下幾點:

<html> 
    <head> 
     <title>Apache Tomcat/7.0.81 - Error report</title> 
     <style> 
      <!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--> 
     </style> 
    </head> 
    <body> 
     <h1>HTTP Status 404 - /REST-Example/rest/UserService/users</h1> 
     <HR size="1" noshade="noshade"> 
     <p> 
      <b>type</b> Status report 
     </p> 
     <p> 
      <b>message</b> 
      <u>/REST-Example/rest/UserService/users</u> 
     </p> 
     <p> 
      <b>description</b> 
      <u>The requested resource is not available.</u> 
     </p> 
     <HR size="1" noshade="noshade"> 
     <h3>Apache Tomcat/7.0.81</h3> 
    </body> 
</html> 
+0

' com.ca'是正確?它不應該是'com.tutorialspoint'嗎? –

+1

另一方面,tutorialspoint上的大多數示例都是在2012年之前編寫的,從未更新過。所以有些東西有點過時了。 –

+0

這是它曾經是,但我想創建一個相同的文件一個新的API,所以我決定重新命名的包com.ca – machiera

回答

0

也許,你缺少一些步驟。我只是按照教程,一切正常。以下是我所做的:

  1. 根據教程網站上的說明配置您的系統。
  2. 創建Eclipse Dynamic Web Project
  3. 下載Jersey 2.17並根據教程網站上的說明將其展開到目錄中。
  4. 複製所有的JAR文件除外javax.servlet-api-3.0.1.jarWEB-INF/lib文件夾。
  5. 在截圖中顯示的文件夾中創建類User.java,UserDao.javaUserService.javaweb.xml
  6. 右鍵單擊該項目(在我的例子:REST-例),並選擇Export>WAR file導出項目WAR文件。
  7. 戰爭文件複製到Tomcat的webapps文件夾,並啓動它。
  8. 啓動您所選擇的瀏覽器,並調用http://localhost:8080/REST-Example/rest/UserService/users,其中REST-Example是沒有文件擴展名的戰爭文件的名稱。

如果您使用的是Maven,它甚至會更簡單:您需要添加一個或兩個依賴項,Maven將負責處理其餘的部分。

enter image description here

+0

謝謝你的幫助,但我仍然有一些原因,相同的異常。另外你爲什麼不把'javax.servlet-api-3.0.1.jar'文件? – machiera

+0

因爲Tomcat應該包含Servlet api。你有什麼例外? – ujulu

+0

和以前一樣:/ – machiera