RestEasy 3.x 系列:使用Hibernate_Validator进行数据校验

本文介绍如何使用Hibernate Validator进行RESTful API的数据校验,包括依赖配置、实体类注解、控制器注解、异常处理及PostMan测试等步骤。

使用Hibernate_Validator进行数据校验,好处不言而喻:规范统一,低耦合度。

1.pom.xml

<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-validator</artifactId>
	<version>5.0.1.Final</version>
</dependency>
		
<dependency>
	<groupId>org.jboss.resteasy</groupId>
	<artifactId>resteasy-validator-provider-11</artifactId>
	<version>3.0.9.Final</version>
</dependency>

2.实体

(PS:lombok ---要使用这个对象,必须还要写一些getter和setter方法,可能还要写一个构造器、equals方法、或者hash方法.这些方法很冗长而且没有技术含量,我们叫它样板式代码

import org.hibernate.validator.constraints.NotBlank;

import lombok.Data;

@Data
public class ApiBankUserDto {
	@NotBlank(message = "姓名不为空")
    private String name;//姓名
	@NotBlank(message = "手机号码不为空")
    private String mobile;//手机号码
	@NotBlank(message = "短信验证码不为空")
    private String emsCode;//短信验证码
	@NotBlank(message = "验证密码不为空")
    private String pwd;//验证密码
}

3.控制器 (@valid 注解 引用的包为:import javax.validation.Valid

	/**
	 * 绑定用户信息
	 * 
	 * @param apiBankUserDto
	 * @param result
	 * @return
	 */
	@POST
	@Path("/bindBankUserInfo")
	public ApiMsgVo bindBankUserInfo(@Context HttpHeaders headers, @Valid ApiBankUserDto apiBankUserDto) {
		WxUserInfoBO wxUserInfoBO = getUserTokenPojo(headers);
		if (wxUserInfoBO == null) {
			return ApiMsgVo.createError("没有登陆");
		}
		ApiMsgVo apiMsgVo = apiBankUserService.bindBankUserInfo(apiBankUserDto, wxUserInfoBO.getOpenid());
		return apiMsgVo;
	}

4.捕获检验异常和message并输出

     resteasy框架为api的异常处理,提供了一个统一的接口,ExceptionMapper<Exception>,我们可以定义一个handler来实现这个接口,就可以捕获resteasy api的异常。如下面的代码:

import java.util.HashMap;
import java.util.Map;

import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

import org.jboss.resteasy.api.validation.ResteasyConstraintViolation;
import org.jboss.resteasy.api.validation.ResteasyViolationException;

import com.cebbank.wx.vo.ApiMsgVo;

@Provider
public class ValidationExceptionHandlerREST implements ExceptionMapper<ResteasyViolationException> {

	@Override
	@Produces("application/json")
	public Response toResponse(ResteasyViolationException exception) {
		// 获取校验失败的反馈信息
		Map<String, String> violations = new HashMap<String, String>();
		ApiMsgVo apiMsgVo = ApiMsgVo.createError("请求参数错误");
		for (ResteasyConstraintViolation violation : exception.getViolations()) {
			violations.put(violation.getPath(), violation.getMessage());
			apiMsgVo = ApiMsgVo.createError(violation.getMessage());
		}
		System.out.print("Violation error");
		return Response.status(Status.BAD_REQUEST).entity(apiMsgVo).build();
		// return
		// Response.status(Status.BAD_REQUEST).entity(violations).build();
	}
}

5.配置web.xml

另外我们需要使用此handler,所以我们在web.xml中启用它。如下面的配置:

<context-param>
    	<param-name>resteasy.providers</param-name>
    	<param-value>com.ec.resteasy.providers.valid.ValidationExceptionHandlerREST</param-value>
	</context-param>

6.利用PostMan工具测试

2025-05-27 17:29:45.743 ERROR 15325 --- [nio-8810-exec-4] [] [] org.jboss.resteasy.resteasy_jaxrs.i18n : RESTEASY002010: Failed to execute javax.ws.rs.NotSupportedException: RESTEASY003200: Could not find message body reader for type: class com.spotter.dtg.aetherflow.admin.adapter.web.request.liteChain.LiteUpdateFlowReq of content type: text/plain;charset=UTF-8 at org.jboss.resteasy.core.interception.ServerReaderInterceptorContext.throwReaderNotFound(ServerReaderInterceptorContext.java:53) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.getReader(AbstractReaderInterceptorContext.java:80) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:53) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.MessageBodyParameterInjector.inject(MessageBodyParameterInjector.java:198) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.MethodInjectorImpl.injectArguments(MethodInjectorImpl.java:91) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:113) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:543) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:432) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$0(ResourceMethodInvoker.java:393) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:358) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:395) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:364) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:337) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:440) [resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:229) [resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:135) [resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:358) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:138) [resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:215) [resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:245) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:61) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final] at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) ~[resteasy-jaxrs-3.12.1.Final.jar:3.12.1.Final]
05-28
异常 : javax.ws.rs.NotSupportedException: RESTEASY003200: Could not find message body reader for type: class com.spotter.dtg.aetherflow.admin.adapter.web.request.LiteSearchFlowReq of content type: */* at org.jboss.resteasy.core.interception.ServerReaderInterceptorContext.throwReaderNotFound(ServerReaderInterceptorContext.java:53) at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.getReader(AbstractReaderInterceptorContext.java:80) at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:53) at org.jboss.resteasy.core.MessageBodyParameterInjector.inject(MessageBodyParameterInjector.java:198) at org.jboss.resteasy.core.MethodInjectorImpl.injectArguments(MethodInjectorImpl.java:91) at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:113) at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:543) at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:432) at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$0(ResourceMethodInvoker.java:393) at org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:358) at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:395) at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:364) at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:337) at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:440) at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:229) at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:135) at org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:358) at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:138) at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:215) at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:245) at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:61) at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) at org.apache.dubbo.rpc.protocol.rest.DubboHttpProtocolServer$RestHandler.handle(DubboHttpProtocolServer.java:89) at org.apache.dubbo.remoting.http.servlet.DispatcherServlet.service(DispatcherServlet.java:61) 的解决方案
03-12
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值