RestEasy 3.x 系列:使用Hibernate_Validator進行資料校驗
阿新 • • 發佈:2018-12-04
使用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>