我用一种名为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);
}
}