泽西岛Web服务引发HTTP 500内部服务器错误

时间:2019-09-05 06:00:51

标签: java eclipse java-ee jersey tomcat9

我用一种名为login的方法在eclipse中创建了Jersey动态Web项目。登录方法生成并使用APPLICATION_XML。我有两个用于登录方法的带有JAX-B注释的类。

我使用基本的Jersey客户端从测试servlet调用login方法。当我从浏览器调用测试servlet时,出现以下异常:

SEVERE: Servlet.service() for servlet [za.co.ezimax.rest.RestTestServlet] in context with path [/ezimax] threw exception
javax.ws.rs.InternalServerErrorException: HTTP 500 Internal Server Error
    at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:1074)
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:859)
    at org.glassfish.jersey.client.JerseyInvocation.lambda$invoke$1(JerseyInvocation.java:743)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:205)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:390)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:741)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:432)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:333)
    at za.co.ezimax.api.RestClient.login(RestClient.java:20)
    at za.co.ezimax.rest.RestTestServlet.loginTest(RestTestServlet.java:30)
    at za.co.ezimax.rest.RestTestServlet.doGet(RestTestServlet.java:36)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:834)

我使用以下POM配置了JERSEY:

        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>2.28</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.inject</groupId>
            <artifactId>jersey-hk2</artifactId>
            <version>2.28</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.3.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0.1</version>
        </dependency>

Jersey应用程序类:

package za.co.ezimax.rest;

import javax.ws.rs.ApplicationPath;

import org.glassfish.jersey.server.ResourceConfig;

@ApplicationPath("/")
public class RestApplication extends ResourceConfig {

    public RestApplication() {
        register(UserResource.class);
    }
}

泽西资源:

package za.co.ezimax.rest;

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 za.co.ezimax.api.ChangeUserPasswordRequest;
import za.co.ezimax.api.ChangeUserPasswordResponse;
import za.co.ezimax.api.LoginRequest;
import za.co.ezimax.api.LoginResponse;
import za.co.ezimax.api.RegisterRequest;
import za.co.ezimax.api.RegisterResponse;
import za.co.ezimax.api.ResetUserPasswordRequest;
import za.co.ezimax.api.ResetUserPasswordResponse;
import za.co.ezimax.api.Response;

@Path("/")
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public class UserResource {

    public UserResource() {
    }

    @POST
    @Path("login")
    public LoginResponse login(LoginRequest loginRequest) {
        return new LoginResponse(true, Response.SUCCESS);
    }
}

LoginRequest类:

package za.co.ezimax.api;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "login-request")
public class LoginRequest extends Request {

    private String mobileNo;    
    private char[] userPassword;

    public LoginRequest() {
        super();
    }

    public LoginRequest(String mobileNo, char[] userPassword) {
        super();
        this.mobileNo = mobileNo;
        this.userPassword = userPassword;
    }

    public String getMobileNo() {
        return mobileNo;
    }

    @XmlElement(name="mobile-no")
    public void setMobileNo(String mobileNo) {
        this.mobileNo = mobileNo;
    }

    public char[] getUserPassword() {
        return userPassword;
    }

    @XmlElement(name="user-password")
    public void setUserPassword(char[] userPassword) {
        this.userPassword = userPassword;
    }   
}

LoginResponse类:

package za.co.ezimax.api;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="login-response")
public class LoginResponse extends Response {

    public LoginResponse(boolean success, short statusCode) {
        super(success, statusCode);
    }

}

响应类别:

package za.co.ezimax.api;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlTransient
public class Response {

    public static final short SUCCESS = 1;  

    private boolean success;    
    private short statusCode;

    public Response(boolean success, short statusCode) {
        super();
        this.success = success;
        this.statusCode = statusCode;
    }

    public boolean isSuccess() {
        return success;
    }

    @XmlElement(name="success")
    public void setSuccess(boolean success) {
        this.success = success;
    }

    public short getStatusCode() {
        return statusCode;
    }

    @XmlElement(name="status-code")
    public void setStatusCode(short statusCode) {
        this.statusCode = statusCode;
    }

    @Override
    public String toString() {
        return "status=" + statusCode;
    }
}

请求类:

package za.co.ezimax.api;

import javax.xml.bind.annotation.XmlTransient;

@XmlTransient
public class Request {

}

RestClient类:

package za.co.ezimax.api;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;

public class RestClient {

    private Client client;

    public RestClient() {
        client = ClientBuilder.newClient();
    }

    public LoginResponse login(LoginRequest loginRequest) {
        WebTarget target = client.target("http://localhost:8080/ezimax/login");
        return target.request(MediaType.APPLICATION_XML)
                .post(Entity.entity(loginRequest, MediaType.APPLICATION_XML), LoginResponse.class);
    }
}

测试Servlet:

package za.co.ezimax.rest;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import za.co.ezimax.api.LoginRequest;
import za.co.ezimax.api.LoginResponse;
import za.co.ezimax.api.RestClient;

@WebServlet("/tests")
public class RestTestServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;
    private RestClient client;

    public RestTestServlet() {
        super();
        client = new RestClient();        
    }

    private void loginTest(PrintWriter writer) {
        writer.append("<b>Login</b>");      
        LoginRequest loginRequest = new LoginRequest("+272900001", "password".toCharArray());
        LoginResponse loginResponse = client.login(loginRequest);
        writer.append(loginResponse.toString());        
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter writer = response.getWriter();
        loginTest(writer);      
    }

}

0 个答案:

没有答案