肿瘤康复网,内容丰富有趣,生活中的好帮手!
肿瘤康复网 > Jax-RS自定义异常处理

Jax-RS自定义异常处理

时间:2024-07-23 21:00:48

相关推荐

使用JEE的好处之一是可用的组件确实是非常标准的。 在使用JAX-RS时,有时您需要控制如何处理异常并将其反馈给用户。 默认情况下,如果引发异常,您将得到一些可怕的HTTP 500内部服务器异常,从而暴露Web服务的内部故障。

考虑以下要点,该端点将用于基于ID查看用户。

@Path("/users")public interface UserWebService {@POST@Consumes({ MediaType.APPLICATION_JSON })@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })@Path("/{userId}")Response getUser(@PathParam("userId") String userId);}

现在,该接口的实现类似于以下内容,以完成实际获取用户的驴工作。

public final class UserWebServiceImpl implements UserWebService {@EJB private UserDao userDao;public Response getUser(final String userId) {final User user = userDao.getUser(userId);return Response.ok().entity(user).build();}}

看起来不错,但请考虑使用Query.getSingleResult来确定 userDao是否正在执行某些实体业务逻辑,并且不存在具有此ID的用户吗?

根据JEE6 API文档,您将收到一个NoResultException ,它将导致暴露内部服务器异常的HTTP 500错误,这绝对是最终用户不应该看到的。 我们需要利用Jax-RS的异常处理!

首先,我们需要一个笨拙的异常对象,适当命名,这将是我们实际抛出的对象,请考虑以下代码。

public class UserWebServiceException extends Exception implementsSerializable {private static final long serialVersionUID = 1169426381288170661L;public UserWebServiceException() {super();}public UserWebServiceException(String msg) {super(msg);}public UserWebServiceException(String msg, Exception e) {super(msg, e);}}

接下来,我们需要修改原始代码以考虑到此异常,我在下面适当地修改了原始UserWebService和关联的实现。

@Path("/users")public interface UserWebService {@POST@Consumes({ MediaType.APPLICATION_JSON })@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })@Path("/{userId}")Response getUser(@PathParam("userId") String userId) throws UserWebServiceException;}

public final class UserWebServiceImpl implements UserWebService {@EJB private UserDao userDao;public Response getUser(final String userId) throws UserWebServiceException {try {final User user = userDao.getUser(userId);} catch(NoResultException e) {throw new UserWebServiceException("User does not exist with id " + userId);}return Response.ok().entity(user).build();}}

现在,当找不到用户时,这将引发适当的异常。 但是,我们仍然需要创建一个Handler对象,以将该异常转换为实际的JSON响应,以便获得友好的错误消息。 下面的类处理此异常,并将异常中的错误消息转换为JSON响应。 您将在此类上看到的重要注释是@Provider注释。

@Providerpublic final class UserWebServiceExceptionHandler implementsExceptionMapper<UserWebServiceException> {@Overridepublic Response toResponse(final UserWebServiceException exception) {return Response.status(Status.BAD_REQUEST).entity(new ErrorMessage(exception.getMessage())).type(MediaType.APPLICATION_JSON).build();}}

您会注意到我们创建了一个ErrorMessage对象来响应Web服务。 这只是一个简单的哑对象,用于保存将编入JSON的实际错误的详细信息。

public class ErrorMessage {private String error;public ErrorMessage(String error) {this.error = error;}public String getError() {return error;}}

将异常处理程序提供程序映射到Web应用程序的最后一步是将以下内容添加到WebApp的web.xml中。

<context-param><param-name>resteasy.providers</param-name><param-value>uk.co.soa.rest.providers.UserWebServiceExceptionHandler</param-value> </context-param>

现在,当我们使用不存在的用户ID调用REST端点时(假设为“ DAG”),我们将很高兴收到以下JSON响应,而不是堆栈跟踪。

{"error": "User does not exist with id DAG"}

翻译自: //05/jax-rs-custom-exception-handling.html

如果觉得《Jax-RS自定义异常处理》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。