В этой статье кратко представлены, как ввести шаги проверки, как сократить количество кода за счет пользовательской проверки и повысить производительность. Особое упоминание: Действительно из не примитивных атрибутов типа, обработка методов получения, единое разрешение сообщений об ошибках проверки.
Фактическая реализация проверки в этой статье поручена для сгибания для обработки для обработки
Базовая конфигурация
POM представляет зависимости Maven
<!-- validation begin --><dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version></dependency><dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <версия> 5.4.0.final </version> </gethysed> <!-end Validation->
Добавить конфигурацию проверки
Добавьте следующую конфигурацию в Spring-MVC-servlet.xml:
<MVC: управляемый аннотациями validator = "validator"> <bean id = "vardator"> <name = "validclass" value = "org.hibernate.validator.hibernatevalidator"/> <name = "validationmessousource" ref = "Сообщения" // Сообщения-это I18N Управление ресурсом.
Пользовательский ExceptionHandler
Персонализируйте сообщение об ошибке проверки, и информация, возвращаемая абоненту, более дружелюбна. Следующая конфигурация добавлена в ApplicationContext.xml:
<!-- Load the i18n message resource file--><bean id="messageSource"> <property name="basenames"> <list> <value>errormsg</value> <value>validation_error</value> </list> </property></bean><bean id="validationExceptionResolver"/>
Добавлено в Project ClassPath: Validation_error_zh_cn.properties Файл ресурса:
#ошибка MSG для проверки ввода#commonfield.can.not.be.null = {field} не может быть пустым полевым полем.can.not.be.empty = {field} не может быть пустым или пустым строковым поле. ValidationExceptionResovler Реализация:
ValidationExceptionResovler.java
@Slf4jpublic class valyationExceptionResovler extreds atternaDlerexceptionResolver {public valyationExceptionResovler () {// Установить порядок и выполнить это. SetRoder (0); } /** * Обработайте случай, когда аргумент аннотирован с {@Code @Valid}, например, * an {@link} или {@link} аргумент не выполняет проверку. * <p> * Custom ValidationException Handler Exception * Получите конкретное сообщение об ошибке проверки и собирайте CommonResponse и возвращайте к вызывающему абоненту. * * @param Запрос текущий http -запрос * @param ответ текущий http response * @param обработчик выполненного обработчика * @return. Пустая модель и указание, что исключение было обработано * @throws ioexception, потенциально выброшенное из response.senderror () */ @responsebody crotector -indetripresultrysultrysultrysultry Запрос httpservlectrequest, httpservletresponse response, обработчик объекта) выбрасывает ioexception {list <objecterror> errors = bindingResult.getAllerrors (); StringBuffer errmsgbf = new StringBuffer (); for (objecterror error: ошибки) {string mass = error.getDefaultmessage (); errmsgbf.append (массаж); errmsgbf.append ("||"); } String errmsgString = errmsgbf.toString (); errmsgstring = errmsgstring.length ()> 2? errmsgstring.substring (0, errmsgstring.length () - 2): errmsgstring; log.error ("Проверка не удалась! {}", errmsgstring); Map <string, object> map = new TreeMap <string, object> (); map.put ("успех", false); map.put ("errorcode", "9999"); map.put ("errormsg", errmsgstring); ModelandView MAV = new ModelAndView (); MappingJackson2jsonView view = new MaptingJackson2jsonView (); view.setattributesmap (map); mav.setView (view); вернуть мав; } @Override Protected ModelAndView DoresOlevexception (запрос httpservletRequest, ответ httpservletresponse, обработчик объекта, Exception ex) {bindingResult bindingResult = null; if (ex exanceOf methodArgumentNotvalidexception) {bindingResult = ((methodArgumentNotvalidexception) ex) .getBindingResult (); } else if (ex exanceOf bindException) {bindingResult = ((bindException) ex) .getBindingResult (); } else {// другое исключение, игнорировать} if (bindingResult! = null) {try {return handlemethodargumentnoTvalidexception (bindingResult, запрос, ответ, handler); } catch (ioException e) {log.error ("doresOlevException:", e); }} return null; }} Добавить @Valid в контроллер
@Requestmapping ("/buy")@responsebodypublic baseresponse buy (@requestbody @valid buyflowerrequest запрос) бросает исключение {// ......} Добавьте аннотацию валидации в атрибуты, которые требуют проверки на боба запроса
@Setter@getterpublic class buyflowerrequest {@notempty (message = "{name.can.not.be.null}") Приватное строковое имя;} Валидация вторичных объектов
Приведенный выше метод написания может подтвердить только базовые атрибуты типа BuyflowerRequest, но нет никакого способа подтвердить атрибуты атрибутов объекта. Если вам нужно проверить атрибуты вторичного объекта, вам необходимо добавить @valid и конкретные аннотации валидации во вторичный объект и атрибуты вторичного объекта одновременно.
Следующий метод написания:
@Setter @getterpublic class buyflowerrequest {@notempty (field = "bianname") частное название строки; @Min (field = "цена", значение = 1) частная цена; @Notnull Private List <waytype> Paytypelist;} @setter @getterpublic class paytype {@valid @min (value = 1) private int paytype; @Valid @min (value = 1) private int payamount;} Далее уменьшить количество кодировки
Чтобы уменьшить рабочую нагрузку кодирования с помощью пользовательских аннотаций проверки, попытаться передать представленное имя проверки в файл ресурса сообщения об ошибке, тем самым избегая написания разных шаблонов сообщений для каждого домена.
Вот пример переписанного @notnull:
1. Определите валидационную аннотацию, обратите внимание, что Field () добавляется по сравнению с нативной аннотацией, которая используется для прохождения проверенного имени, которое подтверждено.
Notnull.java
@Target ({elementtype.method, elementtype.field, elementtype.annotation_type, elementtype.constructor, elementtype.parameter})@constraint (velivatedby = {notnullvalidator.class})@hardenture (streationpolicy.runtume) public @Interface notNull {Strestult waule {strese kalet {strese kaule {strese kaule {strese kaule {strese kaule {) strendent waule {) String message () по умолчанию "{field.can.not.be.null}"; Class <?> [] Groups () default {}; Класс <? Extends Payload> [] Payload () Default {};} 2. Определите валидатор, все валидаторы реализуют интерфейс ConstraintValidator:
Notnullvalidator.java
открытый класс notnullvalidator реализует constraintvalidator <notnull, object> {@override public void initiaze (notnull annotation) {} @override public boolean isvalid (Object str, constraintvalidatorContext constraintValidatorContext) {return str! = null; }} 3. Добавьте валидационную аннотацию в подачу, обратите внимание на указание поданного значения. Если сообщение не имеет индивидуального требования, вам не нужно указывать его. Компонент проверки сам по себе заполнит сообщение по умолчанию.
Buyflowerrequest.java
@Setter @getterpublic class buyflowerrequest {@notempty (field = "bianname") частное название строки; @Min (field = "price", value = 1) private int price;} ПРИМЕЧАНИЕ: аннотация @notnull уже поддерживает специальную проверку списка. Для узлов типа списка, если список == null || list.size () == 0 вернет false, а проверка не удастся. В настоящее время аннотации @notnull, @notempty, @min, @max были настроены в соответствии с этой идеей и могут быть найдены в Проекте товаров.
Поддержка получает запросы
Приведенные выше примеры - все это почтовые запросы. @Requestbody может разрешить запросы на почту, но они не поддерживают запросы GET. Прочитайте документацию Spring и исходный код и обнаружил, что @ModelatTribute может разрешить запросы GET в бобы и подтверждение поддержки. Для получения подробной информации вы можете прочитать исходный код Spring: ModelattributeMethodProcessor.ResolVeargument ().
Пример использования:
@Requestmapping (value = "/buy", method = requestMethod.get) @ResponseBodyPublic Defitavonse Detail (@Valid @modelattribute DetailFlowerRequest запрос) вызывает исключение {detailFlowerResponse = new DetailForeResponse (); response.setName (request.getName ()); return resultfactory.success (response, baseresponse.class);} Тодо
1. Разверните валидацию в соответствии с бизнес -сценариями, такими как: формат даты, сумма и т. Д.
2. Поддержка проверки множественных полевых отношений.
Приложение: весенняя проверка Кейс Кейс Кейс
@Requestbody
Класс реализации: requestResponsebodymethodprocessor.java
Общедоступный объект Resolveargument (параметр MethodParameter, ModelAndViewContainer MavContainer, NativeWebRequest WebRequest, WebDataBinderFactory BinderFactory) Throws Exception {Object arg = this.ReadWithMessageConverters (webRequest, parameter, parameter.getGenericParameterType ()); String name = conventions.getvariablenameforparameter (параметр); Webdatabinder binder = bindfactory.createbinder (webRequest, arg, name); if (arg! = null) {this.validateifapplicable (binder, parameter); if (binder.getBindingResult (). haserrors () && this.isbindexceptionRequired (binder, parameter)) {Throw New MethodArgumentNotvalidexception (параметр, binder.getBindingResult ()); }} mavcontainer.addattribute (bindingResult.model_key_prefix + name, binder.getBindingResult ()); вернуть arg;} @Modelattuite
Класс реализации: modelattributemethodprocessor.java
Public Final Object Resolveargument (параметр MethodParameter, ModelAndViewContainer MavContainer, NativeWebRequest webRequest, WebDataBinderFactory BinderFactory) Throws {String name = modelfactory.getNameForparameter (параметр); Attribute объекта = mavcontainer.containsattribute (name)? mavcontainer.getmodel (). get (name): this.createattribute (имя, параметр, bindfactory, webrequest); if (! mavcontainer.isbindingDisabled (name)) {modelattribute ann = (modelattribute) parameter.getParameterannotation (modelattribute.class); if (ann! = null &&! ann.binding ()) {mavcontainer.setBindingDisabled (name); }} Webdatabinder binder = bindfactory.createbinder (webRequest, attribute, name); if (binder.getTarget ()! = null) {if (! mavcontainer.isbindingDisabled (name)) {this.bindrequestParameters (binder, webRequest); } this.validateifApplicable (binder, parameter); if (binder.getBindingResult (). haserrors () && this.isbindexceptionRequired (binder, parameter)) {бросить новое BindException (binder.getBindingResult ()); }} Map <string, object> bindingResultmodel = binder.getBindingResult (). GetModel (); mavcontainer.removeattributes (BindingResultmodel); mavcontainer.addallattributes (BindingResultmodel); return binder.convertifnecessary (binder.getTarget (), parameter.getParameterType (), параметр);}Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.