2015-06-20 20 views
1

只是几次我接近其余的服务,我想问一个简单的问题......至少我希望它很简单!用休息CXF处理异常

我有这样的服务:

@Override 
public UserTO register(UserTO userTO) { 
    UserTO user=null; 
    try{ 
    user=presentationService.register(userTO); 
    } 
    catch(ConstraintViolationException ex) 
    { 
     throw new CustomException(ex.getMessage()); 
    } 
    return user; 

} 

而且我这个客户:

@RequestMapping(value = "/register", method = RequestMethod.POST) 
public String processRegistration(@ModelAttribute("userForm")UserTO user, Map<String, Object> model) { 
    UserTO userTO=null; 
    String error=""; 
    Response resp; 
    userTO=registerme(client, user); 
} 

这是个例外:

public class CustomException extends WebApplicationException { 
public CustomException(String message) { 
    super(Response.status(Response.Status.BAD_REQUEST) 
     .entity(message).type(MediaType.TEXT_PLAIN).build()); 
} 
} 

我想知道如何管理客户端的异常...

为xample当我把这种服务,并获取和错误,从后端我:

2015-06-20 18:44:28 WARN SqlExceptionHelper:143 - SQL Error: 1062, SQLState: 23000 
    2015-06-20 18:44:28 ERROR SqlExceptionHelper:144 - Duplicate entry 'aa' for key 'login_UNIQUE' 
    2015-06-20 18:44:28 INFO LoggingOutInterceptor:233 - Outbound Message 
    --------------------------- 
    ID: 1 
    Response-Code: 400 
    Content-Type: text/plain 
    Headers: {Content-Type=[text/plain], Date=[Sat, 20 Jun 2015 16:44:28  GMT]} 
    Payload: Nn funziona! Duplicate entry 'aa' for key 'login_UNIQUE'; SQL  [n/a]; constraint [null]; nested exception is    org.hibernate.exception.ConstraintViolationException: Duplicate entry 'aa' for key 'login_UNIQUE' 

,以及在客户我:

[INFO] Starting scanner at interval of 3 seconds. 
[ERROR] /DisConnectionView/register 
javax.ws.rs.WebApplicationException 

然后 拒绝连接。

我知道这是一个小白的问题,但有一点帮助将是巨大的..

也许我可以换,我可以通过该服务返回的响应元素中的例外,但如果我想返回简单的UserTO,是否有另一种方式来管理异常并获取客户端的类型或消息?

谢谢!

+0

这不是一个noob问题,而是非常有趣。 +1 – Xstian

回答

1

我建议你使用下面的例子。

服务器端javax.ws.rs.ext.ExceptionMapper

public class RuntimeExceptionRestMapper implements ExceptionMapper<RuntimeException> { 

    public Response toResponse(RuntimeException exception) { 
     return Response.status(Response.Status.INTERNAL_SERVER_ERROR) 
       //handle your response 
       .type(MediaType.APPLICATION_JSON_TYPE) 
       .entity(exception.getMessage()) 
       .build(); 
    } 

} 

服务器配置XML

<jaxrs:server id="" address=""> 
    <jaxrs:serviceBeans> 
     .... 
    </jaxrs:serviceBeans> 
    <jaxrs:providers> 
     <bean class="package.RuntimeExceptionRestMapper" /> 
    </jaxrs:providers> 
</jaxrs:server> 

客户端org.apache.cxf.jaxrs.client.ResponseExceptionMapper

public class RestResponseExceptionMapper implements ResponseExceptionMapper<Exception> { 

    public Exception fromResponse(Response r) { 
     //throw you exception 
     return new WebApplicationException(r.getStatus()); 
    } 

} 

客户端配置XML

<jaxrs:client id="service" address="" serviceClass=""> 
    <jaxrs:providers> 
     <bean class="package.RestResponseExceptionMapper" /> 
    </jaxrs:providers> 
</jaxrs:client> 
+0

谢谢Xstian,我会试着让你知道:) – ivoruJavaBoy

+0

它的工作原理谢谢...唯一的区别是我添加了提供程序来通过代码“映射异常”,而不是Spring配置;) – ivoruJavaBoy