在部署时跳过了Jersey ExceptionMapper实现

时间:2014-12-28 16:11:37

标签: java tomcat jersey-2.0

在我的宠物项目中,我有一个简单的jersey(v 2.13)资源执行一些crud操作,输入由hibernate-validator(v 5.0.1.Final)验证。 问题是虽然junit测试按预期工作,但当我部署webapp时,所有ExceptionMapper实现都会被忽略。

这里有一些细节:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public JsonResult<User> addUser(@Valid Userbean user) {
  //do stuff...
}

验证由hibernate-validator完成。

Userbean注释为:

@NotNull
private String password;

我已经创建了一个ExceptionMapper实现:

@Provider
public class ValidationExceptionMapper implements ExceptionMapper<ValidationException> {
   @Override
   public Response toResponse(ValidationException e) {
   return Response.status(422).build();
   }
}

暂不考虑验证时,正确的状态代码应为400,我的问题是,在我的junit-test中,一切都很顺利......

        Userbean entity = new Userbean();
        entity.setUsername(username);

        Response response = target.path("users").request(MediaType.APPLICATION_JSON).post(Entity.json(entity));
        int status = response.getStatus();
        assertEquals(422 status);

...当我在tomcat上运行它时,我无法重现相同的行为(我已尝试过tomcat7 / tomcat 8以及glassfish 4.1)

我总是得到一个400状态代码而不是422,并且正在跳过ValidationExceptionMapper。

$ curl -v -X POST -H "Content-Type: application/json" --data "{\"username\":\"MrFoo\"}" http://localhost:8080/playground-webapp/jaxrs/jersey/users/
* About to connect() to localhost port 8080 (#0)
*   Trying ::1... connected
> POST /playground-webapp/jaxrs/jersey/users/ HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: localhost:8080
> Accept: */*
> Content-Type: application/json
> Content-Length: 20
> 
* upload completely sent off: 20out of 20 bytes
< HTTP/1.1 400 Bad Request
< Server: Apache-Coyote/1.1
< Content-Type: text/html;charset=utf-8
< Content-Language: en
< Content-Length: 990
< Date: Sun, 28 Dec 2014 15:07:34 GMT
< Connection: close
< 
* Closing connection #0
<html><head><title>Apache Tomcat/7.0.52 - 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 400 - Bad Request</h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u>Bad Request</u></p><p><b>description</b> <u>The request sent by the client was syntactically incorrect.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/7.0.52</h3></body></html>

在测试服务器上进行的相同调用按预期工作:

curl -v -X POST -H "Content-Type: application/json" --data "{\"username\":\"MrFoo\"}" http://localhost:8080/users/
* About to connect() to localhost port 8080 (#0)
*   Trying ::1... Connessione rifiutata
*   Trying 127.0.0.1... connected
> POST /users/ HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: localhost:8080
> Accept: */*
> Content-Type: application/json
> Content-Length: 20
> 
* upload completely sent off: 20out of 20 bytes
< HTTP/1.1 422
< Content-Type: application/json
< Date: Sun, 28 Dec 2014 15:05:35 GMT
< Content-Length: 94
< 
* Connection #0 to host localhost left intact

我用于junit的服务器的代码是:

@Before
public void setUpClient() throws Exception {
    ResourceConfig rc = new UserResourceConfig();
    rc.property("contextConfig", appContext);
    server = GrizzlyHttpServerFactory.createHttpServer(BASE_URI, rc);
    server.start();
    ....

提前感谢您的帮助。

0 个答案:

没有答案