введение
При использовании SpringMVC в качестве уровня контроллера для веб -разработки часто необходимо выполнить проверку параметров на методах контроллера. Первоначально, SpringMVC поставляется с двумя аннотациями @Valid и @Validated Annotations, которые можно использовать для проверки параметров, но его можно проверить только тогда, когда параметры являются бобами. Это не применимо к таковым из строки или длинных. Иногда эти две аннотации внезапно терпят неудачу (причины не были тщательно исследованы). В связи с этим вы можете использовать Spring AOP и пользовательские аннотации для самостоятельного написания функции проверки параметров.
Пример кода
Примечание. Код в этом разделе - это просто демонстрация, дающая возможную идею, а не полное решение.
Этот проект - простой веб -проект, который используется: Spring, Springmvc, Maven, JDK1.8
Структура проекта:
Пользовательские аннотации:
Validparam.java:
Пакет com.lzumetal.ssm.paramcheck.annotation; импорт java.lang.annotation.*;/***Анонирован на параметра
Notnull.java:
пакет com.lzumetal.ssm.paramcheck.annotation; import java.lang.annotation.*;@target ({elementtype.field, elementtype.parameter})@reatention(retentionpolicy.runtime)@documentedpublic @Interface notnull {строгий msg () Defaultime 'Files не может быть пустым "; }Notempty.java:
Пакет com.lzumetal.ssm.paramcheck.annotation; импорт java.lang.annotation.*;@target ({elementtype.field, elementtype.parameter})@reatention(retentionpolicy.runtime)@documentedpublic @Interface Notempty {String MSG () Defaultime 'Files не может быть пустым "; } Срезать лицо
Paramcheckaspect.java:
пакет com.lzumetal.ssm.paramcheck.aspept; import com.lzumetal.ssm.paramcheck.annotation.notempty; импорт com.lzumetal.ssm.paramcheck.annotation.notnull; импорт com.lzumetal.ssm.paramcheck.annotation.validparam; org.apache.commons.lang3.stringutils; import org.aspectj.lang.joinpoint; импорт org.aspectj.lang.annotation.aspept; импорт org.aspectj.lang.annotation.before; импорт org.aspectj.lang.reflect.methodsignature; javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import javax.servlet.http.httpservletresponse; import javax.servlet.http.httpsession; import.lang.Reflec. java.lang.reflect.parameter; import java.util.arrays;/**** объект объекта параметра [] args = joinpoint.getargs (); // Получить метод параметров методики сигнатуры = (методикатедленная) joinpoint.getSignature (); Параметр [] параметры = signature.getmethod (). GetParameters (); for (int i = 0; i <parameters.length; i ++) {параметр параметров = параметры [i]; // собственные основные типы параметров Java (например, Integer, String) обрабатываются if (iSprimite (parameter.getType ())) {notnull notnull = parameter.getannotation (notnull.class); if (notnull! = null && args [i] == null) {бросить новое runtimeexception (parameter.tostring () + notnull.msg ()); } // todo продолжить; } /** Нет обработки, когда аннотация @ValidParam не помечена, или когда это не выполнено* / if (parameter.getType (). IsassignableFrom (httpservletrequest.class) || parameter.gettype (). isassignablefrom (httpsession.class) ||. } Class <?> ParamClazz = parameter.getType (); // Получить объект параметра, соответствующий типу. Интерфейс в контроллере в фактическом проекте не будет передавать два параметра одного и того же пользовательского типа, поэтому используйте findfirst () непосредственно здесь. Object arg = arrays.stream (args) .filter (ar -> paramclazz.isassignablefrom (ar.getclass ())). Findfirst (). Get (); // Получить все переменные элемента поля параметра [] decladlefields = paramClazz.getDeclaredFields (); для (поле Поля: DecledFields) {field.SetAccessible (true); // Проверьте поля, помеченные @notnull notnull = field.getannotation (notnull.class); if (notnull! = null) {Object fieldValue = field.get (arg); if (fieldvalue == null) {бросить новое runtimeexception (field.getName () + notnull.msg ()); }} // Проверьте поля, помеченные @notempty аннотацией, Notempty используется только в типе строки notempty notempty = field.getannotation (notempty.class); if (notempty! = null) {if (! string.class.isassignablefrom (field.getType ())) {throw new Runtimeexception ("Notempty Annotation с использованием в неверном классе поля"); } String fieldstr = (string) field.get (arg); if (stringutils.isblank (fieldstr)) {бросить новое runtimeexception (field.getName () + notempty.msg ()); }}}}} /**. false: не */ private boolean isprimite (class <?> clazz) {return clazz.isprimity () || clazz == string.class; }} Параметры Javabean
StudentParam.java:
Пакет com.lzumetal.ssm.paramcheck.requestparam; import com.lzumetal.ssm.paramcheck.annotation.notempty; импорт com.lzumetal.ssm.paramcheck.annotation.notnull; открытый класс Студент Par частный целый возраст; @Notempty Private String Имя; // get, установить методы опущены ...}
Контроллер для проверки проверки параметров
Testcontroller.java:
Пакет com.lzumetal.ssm.paramcheck.controller; import com.google.gson.gson; импорт com.lzumetal.ssm.paramcheck.annotation.notnull; импорт com.lzumetal.ssm.paramcheck.annotation.validparam; importcumetal.ssm.paramCheck.RequeCeck.RequeCeck.RequeCeck.RequeCeck.RequeCeck.RequeCeck.RequeCeck.RequestAtration.ValidParam; org.springframework.stereotype.controller; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bindtation.RequestMethod; import org.springforkwork.web.bindation.ressonsemethod; Static Gson Gson = new Gson (); @Responsebody @RequestMapping (value = "/test", method = requestMethod.post) public StudentParam CACEPARAM (@ValidParam StudentParam Param, @notnull Integer Limit) {System.out.println (gson.tojson (param)); System.out.println (Limit); вернуть парам; }} Пример кода в этом разделе был загружен в GitHub: https://github.com/liaosilzu2007/ssm-parent.git
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.