Jax-RS自定义异常处理

使用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 implements
	Serializable {

	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注释。

@Provider
public final class UserWebServiceExceptionHandler implements
	ExceptionMapper<UserWebServiceException> {

	@Override
	public 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"
}

翻译自: https://www.javacodegeeks.com/2014/05/jax-rs-custom-exception-handling.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值