`
cqh520llr
  • 浏览: 520920 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

spring BindingResult errors验证 + 日志拦截器

 
阅读更多
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;

/**
* HibernateValidator错误结果处理切面
* Created by macro on 2018/4/26.
*/
@Aspect
@Component
@Order(2)
public class BindingResultAspect {
    @Pointcut("execution(public * com.sangem.codeorder.controller.*.*(..))")
    public void BindingResult() {
    }

    @Around("BindingResult()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            if (arg instanceof BindingResult) {
                BindingResult result = (BindingResult) arg;
                if (result.hasErrors()) {
                    FieldError fieldError = result.getFieldError();
                    if(fieldError!=null){
                        return CommonResult.validateFailed(fieldError.getDefaultMessage());
                    }else{
                        return CommonResult.validateFailed();
                    }
                }
            }
        }
        return joinPoint.proceed();
    }
}



import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.json.JSONUtil;
import io.swagger.annotations.ApiOperation;
import net.logstash.logback.marker.Markers;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* 统一日志处理切面
* Created by macro on 2018/4/26.
*/
@Aspect
@Component
@Order(1)
public class WebLogAspect {
    private static final Logger LOGGER = LoggerFactory.getLogger(WebLogAspect.class);

    @Pointcut("execution(public * com.sangem.codeorder.controller.*.*(..))")
    public void webLog() {
    }

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
    }

    @AfterReturning(value = "webLog()", returning = "ret")
    public void doAfterReturning(Object ret) throws Throwable {
    }

    @Around("webLog()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        //获取当前请求对象
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //记录请求信息(通过Logstash传入Elasticsearch)
        WebLog webLog = new WebLog();
        Object result = joinPoint.proceed();
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        if (method.isAnnotationPresent(ApiOperation.class)) {
            ApiOperation log = method.getAnnotation(ApiOperation.class);
            webLog.setDescription(log.value());
        }
        long endTime = System.currentTimeMillis();
        String urlStr = request.getRequestURL().toString();
        webLog.setBasePath(StrUtil.removeSuffix(urlStr, URLUtil.url(urlStr).getPath()));
        webLog.setIp(request.getRemoteUser());
        webLog.setMethod(request.getMethod());
        webLog.setParameter(getParameter(method, joinPoint.getArgs()));
        webLog.setResult(result);
        webLog.setSpendTime((int) (endTime - startTime));
        webLog.setStartTime(startTime);
        webLog.setUri(request.getRequestURI());
        webLog.setUrl(request.getRequestURL().toString());
        Map<String,Object> logMap = new HashMap<>();
        logMap.put("url",webLog.getUrl());
        logMap.put("method",webLog.getMethod());
        logMap.put("parameter",webLog.getParameter());
        logMap.put("spendTime",webLog.getSpendTime());
        logMap.put("description",webLog.getDescription());
//        LOGGER.info("{}", JSONUtil.parse(webLog));
        LOGGER.info(Markers.appendEntries(logMap), JSONUtil.parse(webLog).toString());
        return result;
    }

    /**
     * 根据方法和传入的参数获取请求参数
     */
    private Object getParameter(Method method, Object[] args) {
        List<Object> argList = new ArrayList<>();
        Parameter[] parameters = method.getParameters();
        for (int i = 0; i < parameters.length; i++) {
            //将RequestBody注解修饰的参数作为请求参数
            RequestBody requestBody = parameters[i].getAnnotation(RequestBody.class);
            if (requestBody != null) {
                argList.add(args[i]);
            }
            //将RequestParam注解修饰的参数作为请求参数
            RequestParam requestParam = parameters[i].getAnnotation(RequestParam.class);
            if (requestParam != null) {
                Map<String, Object> map = new HashMap<>();
                String key = parameters[i].getName();
                if (!StringUtils.isEmpty(requestParam.value())) {
                    key = requestParam.value();
                }
                map.put(key, args[i]);
                argList.add(map);
            }
        }
        if (argList.size() == 0) {
            return null;
        } else if (argList.size() == 1) {
            return argList.get(0);
        } else {
            return argList;
        }
    }
}
分享到:
评论

相关推荐

    spring_validator验证

    在这里,如果用户提交的数据不符合`User`类上的验证规则,`BindingResult`对象将包含验证错误信息,可以进一步处理这些错误。 ### 四、自定义Validator 虽然JSR-303/349提供了一系列通用的验证注解,但有时我们...

    spring 验证总结

    在上述示例中,`BindingResult`参数用于捕获验证结果,如果验证失败,Controller方法将返回注册页面并显示错误消息。 结合使用这两种验证方式,Spring提供了强大的数据验证能力,既支持简单的注解驱动验证,也允许...

    利用spring-modules验证框架进行表单验证

    在控制器层,你可以使用`BindingResult`或`Errors`对象来获取验证结果。在处理表单提交的请求方法中,通常会将`BindingResult`作为参数传递,它会在数据绑定后自动调用相应的Validator,并将验证结果存储在其中。...

    spring注解-validation所用到的jar包

    例如,当我们有一个`User`实体类,其中包含了一些需要验证的字段,我们可以在控制器的处理方法上使用`@Valid`注解,Spring MVC会自动调用Hibernate Validator进行验证,并将错误信息注入到BindingResult对象中。...

    Spring3.0 + springmodules 实现validator

    在上面的例子中,`User`类的属性可能包含了如`@NotBlank`的注解,如果输入不符合规则,`BindingResult`对象将包含验证错误信息。 至于Spring MVC,它是Spring框架的一部分,提供了一个强大的模型-视图-控制器(MVC...

    SpringMVC+jsp之表单验证登录

    如果验证失败,SpringMVC会自动将错误信息填充到BindingResult对象中,我们可以在视图层展示这些错误。 JSP(JavaServer Pages)是一种动态网页技术,常用于创建视图。在登录场景下,我们可以创建一个login.jsp文件...

    spring validate 笔记

    Spring MVC的validate功能是用于处理数据...通过自定义验证器和利用`BindingResult`,我们可以方便地捕获和处理验证错误,保证了业务逻辑的正确性。在实际应用中,可以根据需要扩展验证规则,提供更丰富的验证功能。

    java后端验证框架源码

    其中,`@Validated`用于启动验证,`BindingResult`用于接收验证结果。 7. **错误回显** 错误信息可以自定义并返回给前端,这对于用户体验至关重要。开发者可以通过配置自定义的MessageSource,为每个验证错误定义...

    SpringMVC数据验证——注册用户格式的验证实例

    在`@PostMapping`的方法中,使用`@Valid`注解来触发验证,如果数据无效,Spring MVC会自动将错误消息存储在`BindingResult`对象中: ```java @PostMapping("/register") public String register(@Valid User user, ...

    spring+hibernate启动优化

    ### Spring + Hibernate 启动优化详解 #### 一、背景介绍 在开发大型项目时,尤其是在采用Spring + Hibernate架构的情况下,项目的启动速度往往会影响到开发效率。例如,在一个使用Struts + Spring + Hibernate技术...

    springmvc注解实现用户注册验证

    你可以引入第三方库如Hibernate Validator进行更复杂的验证,或者使用拦截器(`@Interceptor`)来执行通用的预处理或后处理逻辑。此外,通过集成Spring Security,可以轻松实现权限控制和登录功能,以保护用户注册...

    SpringMVC使用Validation验证表单

    如果验证失败,`BindingResult`参数将包含错误信息。我们可以检查`result.hasErrors()`,并在存在错误时返回表单页面,以便显示错误消息。 为了显示错误消息,我们需要在Thymeleaf或者JSP视图模板中获取并渲染它们...

    spring注入web端校验类

    在这里,`@Valid`注解会触发`UserValidator`的验证,如果验证失败,`BindingResult`对象会包含错误信息。 4. **JSR 303/JSR 349 Bean Validation**:另一种常见的验证方式是使用Bean Validation,它提供了一种声明...

    springmvc注解式控制器的数据验证、类型转换及格式化 SpringMVC数据验证

    除此之外,Spring MVC还支持自定义拦截器(`HandlerInterceptor`),可以全局地处理参数转换、验证等操作,进一步提高了代码的复用性和灵活性。 总结来说,Spring MVC的注解式控制器提供了强大的数据验证、类型转换...

    Spring web MVC和spring 2.0 form tag解说

    这些标签包括、、&lt;form:errors&gt;等,它们与Spring的BindingResult和ModelAttribute机制相结合,实现了模型数据与表单元素的自动绑定和错误处理。 **4. Form Tag常用标签** - `&lt;form:form&gt;`: 创建一个HTML表单,它...

    使用Mapper接口方式整合MyBatis-Spring图书管理系统源代码

    if(bindingResult.hasErrors()){ err(bindingResult,model); return "/jsp/user/useredit"; }else { userService.updateUser(user); return "redirect:toUserList"; } } //删除 @RequestMapping("/user...

    Spring MVC 实例

    Spring MVC 允许开发者定义拦截器,这些拦截器可以在请求处理前后执行自定义逻辑,例如登录检查、日志记录等。过滤器则是在 Servlet 容器层面处理请求和响应,如字符编码转换、安全过滤等。 ### 7. RESTful 风格 ...

    SpringMVC杂记(五) JSR303数据验证

    如果验证失败,Spring会自动创建一个包含错误信息的`BindingResult`对象,开发者可以通过这个对象获取并显示错误信息。 为了实现JSR303验证,我们需要在项目中引入相关的依赖,比如Hibernate Validator,它是JSR303...

    springmvc验证需要的jar

    此外,`BindingResult`对象用于存储验证结果,可以用来处理错误信息。你需要确保Spring MVC的jar包也包含在类路径中。 4. **使用示例**: 在模型类中,你可以定义验证规则: ```java public class User { @Not...

    springboot日志配置.zip

    SpringBoot是Java开发中的一个流行框架,它简化了Spring应用的初始搭建以及开发过程。其中,日志配置是每个应用程序必不可少的部分,它帮助开发者跟踪、调试和分析程序运行时的行为。在SpringBoot中,日志系统是高度...

Global site tag (gtag.js) - Google Analytics