简体   繁体   English

Jersey Web服务提供了javax.servlet.ServletException:

[英]Jersey web service gives javax.servlet.ServletException:

OK I have a problem with my web service. 好的,我的网络服务有问题。

I am trying to make an API for a user but after I have deployed the app and try to GET all users it gives me an exception. 我正在尝试为用户创建API,但是在部署应用程序并尝试获取所有用户之后,它给了我一个例外。

Here is my api class: 这是我的api类:

package api;


import java.util.ArrayList;

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

import model.UserManager;

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

import dto.User;

@Path("/user")
public class UserAPI {

    @POST 
    @Path("create-user/{user}")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response saveUser(@PathParam("user") User user) throws JSONException {
        UserManager userManager = new UserManager();
        userManager.createUser(user);

        return Response.status(200).build();    
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public JSONObject getAllUsers() throws JSONException {
        JSONObject users = null;
        try {
            ArrayList<User> usersList = null;
            UserManager userManager = new UserManager();
            usersList = userManager.getUsers();
            JSONObject usersObject = new JSONObject();
            for(int i = 0; i < usersList.size(); i++) {
                usersObject.put("users", usersList);
            }
            users = usersObject;
        } catch(Exception e) {
            e.printStackTrace();
        }
        return users;   
    }

    @POST 
    @Path("edit-user/{id}")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response editUser(@PathParam("id") int id) throws JSONException {
        UserManager userManager = new UserManager();
        userManager.editUser(id);

        return Response.status(200).build();    
    }

    @POST 
    @Path("delete-user/{id}")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response deleteUser(@PathParam("id") int id) throws JSONException {
        UserManager userManager = new UserManager();
        userManager.deleteUser(id);

        return Response.status(200).build();    
    }

    @POST 
    @Path("user-login/{user}")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response userLogin(@PathParam("user") User user) throws JSONException {
        UserManager userManager = new UserManager();
        userManager.userLogin(user);

        return Response.status(200).build();    
    }
}

Here is the error log: 这是错误日志:

javax.servlet.ServletException: Servlet.init() for servlet Jersey REST Service threw exception
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:683)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Thread.java:745)

com.sun.jersey.spi.inject.Errors$ErrorMessagesException
    com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)
    com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136)
    com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199)
    com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:795)
    com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:790)
    com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:491)
    com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:321)
    com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:605)
    com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:207)
    com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:376)
    com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:559)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:683)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Thread.java:745)

Why dont you return the list of users as is instead of converting it into a json object? 为什么不按原样返回用户列表,而不是将其转换为json对象? Try this: 尝试这个:

@GET
@Produces(MediaType.APPLICATION_JSON)
public List<User> getAllUsers() {
    JSONObject users = null;
    try {
        ArrayList<User> usersList = null;
        UserManager userManager = new UserManager();
        usersList = userManager.getUsers();
    } catch(Exception e) {
        e.printStackTrace();
    }
    return usersList;   
}

And to invoke the above method from your view, you can use the follwing jquery ajax call: 并从您的视图中调用上述方法,您可以使用下面的jquery ajax调用:

$.ajax({
type: "GET",
url: "http://localhost:8080/YourProjectName/rest/user",
dataType: "json",
success: function(jsonString) {
   alert(jsonString);
},
error: function(xhr) {                     
    alert(JSON.stringify(xhr));
}

}); });

If it's still not working, then it can be an issue with the set of libraries that you are using. 如果仍然无法正常工作,则可能与您正在使用的一组库有关。 Hence I suggest you to use GlassFish 4.0 application server instead of Tomcat server. 因此,我建议您使用GlassFish 4.0应用程序服务器而不是Tomcat服务器。 If you use GlassFish server, you must not include any jersey jar in your classpath as GlassFish server itself has all jersey related jars. 如果您使用GlassFish服务器,则您的类路径中不得包含任何球衣罐,因为GlassFish服务器本身具有所有球衣相关的罐。

First of all, you want to submit a User object as a PathParam. 首先,您要提交一个User对象作为PathParam。 This will not work! 这行不通!
Also i would like to suggest you, to make UserManager a Singleton. 我也想建议你,让UserManager成为Singleton。
Than, you should use GET, PUT, POST, DELETE and not just GET and POST 比,您应该使用GET,PUT,POST,DELETE,而不仅仅是GET和POST

I think the exception says that you have made a mistake in your web.xml and jersey is'nt able to find the (or any) @Path. 我认为该异常表明您在web.xml中犯了一个错误,并且jersey无法找到(或任何)@Path。 Therefore, pls give us the web.xml to prove that and you pom.xml to check that too. 因此,请给我们web.xml证明这一点,而您给pom.xml证明一下。

Btw, jersey brings (un)marshallers, don't see a reason to use JSONObject. 顺便说一句,泽西岛带来了(un)编组员,看不出使用JSONObject的理由。

Here some stuff: 这里有一些东西:

simple web.xml 简单的web.xml

<?xml version="1.0" encoding="UTF-8"?>
    <!-- not required with servlet 3.x -->
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>REST</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>path.to.ResourceConfigOrApplication</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>REST</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

pom.xml (partly) pom.xml(部分)

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.plugin.version>2.5.1</maven.compiler.plugin.version>
    <tomcat7.version>2.1</tomcat7.version>
    <jersey.version>2.12</jersey.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey</groupId>
            <artifactId>jersey-bom</artifactId>
            <version>${jersey.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <!-- JERSEY -->
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.bundles</groupId>
        <artifactId>jaxrs-ri</artifactId>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-processing</artifactId>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
    </dependency> 
    // ...

Very Simple User: 非常简单的用户:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @XmlElement(name="id")
    private Integer id;

    @XmlElement(name="username")
    private String username;

    // ...
}

And the simple resource (based on yours): 和简单的资源(根据您的资源):

@Path("/users") // changed from user to users 
public class UserAPI {

    @POST 
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response saveUser(User user) {
        user = UserManager.getInstance().createUser(user);
        return Response.ok(user).build();    
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getAllUsers() {
        List<User> users = UserManager.getInstance().getUsers();
        GenericEntity<List<User>> entity = new GenericEntity<List<User>>(
            users
        ){};
        return Response.ok( entity ).build();
    }

    @PUT // edit-user -> PUT 
    @Path("/{id}")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response editUser(@PathParam("id") Integer id, User user) {
        user = UserManager.getInstance().editUser(id, user); // check id and uder.id, if user exists etc
        return Response.ok(user).build();
    }

    @DELETE // delete-user -> DELETE
    @Path("/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response deleteUser(@PathParam("id") Integer id) {
        UserManager.getInstance().deleteUser(id);
        return Response.ok().build();    
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM