spring boot空属性赋值问题与aspect日志实现方法

空属性赋值问题

MyBeanUtils类

public class MyBeanUtils {

 public static String[] getNullPropertyNames(Object source){
  BeanWrapper beanWrapper=new BeanWrapperImpl(source);
  PropertyDescriptor[] pds=beanWrapper.getPropertyDescriptors();
  List<String> nullPropertyNames=new ArrayList<>();
  for (PropertyDescriptor pd:pds){
   String propertyName=pd.getName();
   if(beanWrapper.getPropertyValue(propertyName)==null){
    nullPropertyNames.add(propertyName);
   }
  }
  return nullPropertyNames.toArray(new String[nullPropertyNames.size()]);
 }
}

在NewServiceImpl中对updateNew方法进行修改

@Override
 public News updateNew(Long id, News news) {
  News news1=newRepository.findById(id).orElse(null);
  if(news1==null){
  //  System.out.println("未获得更新对象");
   throw new NotFoundException("该新闻不存在");
  }
  //更新后传入的news复制给news1,查找更新数据news中空值属性,忽略不复制给news1
  BeanUtils.copyProperties(news,news1, MyBeanUtils.getNullPropertyNames(news));
  news1.setUpdateTime(new Date());
  return newRepository.save(news1);
 }

日志打印

新建一个LogAspect类

@Aspect
@Component
public class LogAspect {

 private final Logger logger= LoggerFactory.getLogger(this.getClass());

 @Pointcut("execution(* com.zr0726.news.web.*.*(..))")
 public void log(){}

 @Before("log()")
 public void doBefore(JoinPoint joinPoint){
  //获得request
  ServletRequestAttributes attributes=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  HttpServletRequest request=attributes.getRequest();
  //获得url和ip
  String url=request.getRequestURL().toString();
  String ip=request.getRemoteAddr();
  String classMethod=joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName();
  Object[] args=joinPoint.getArgs();
  Requestlog requestlog=new Requestlog(url,ip,classMethod,args);
  logger.info("_____________________doBefore_______________________");
 }

 @After("log()")
 public void doAfter(){
  logger.info("_____________________doAfter_______________________");
 }

 @AfterReturning(returning = "result",pointcut = "log()")
 public void adAfterReturn(Object result){
  logger.info("Result: {}",result);
 }

 private class Requestlog{
  private String url;
  private String ip;
  private String classMethod;
  private Object[] args;

  public Requestlog(String url, String ip, String className, Object[] args) {
   this.url = url;
   this.ip = ip;
   this.classMethod = className;
   this.args = args;
  }

  @Override
  public String toString() {
   return "Requestlog{" +
     "url='" + url + '\'' +
     ", ip='" + ip + '\'' +
     ", classMethod='" + classMethod + '\'' +
     ", args=" + Arrays.toString(args) +
     '}';
  }
 }
}

效果展示

总结

到此这篇关于spring boot空属性赋值问题与aspect日志实现方法的文章就介绍到这了,更多相关spring boot空属性赋值内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot~ObjectMapper~dto到entity的自动赋值

    实体与Dto自动赋值 在开发的过程中,实体之间相互赋值是很正常的事,但是我们一般的方法都通过set和get方法来进行的,如果要赋值的字段少那还行,但是需要赋值的字段超过10个,那就是个灾难,你会看到整屏代码中全是set和get方法. 两个实体属性字段几乎完全相同 两个字体有部分字段相同 源实体只有部分字段赋值,目标实体有完整的值 第一种情况 对于第1点来说,我们用到最多的就是entity和dto之间的转换了,这个我们可以使用Spring的工具类BeanUtils来解决,这里要注意的一点是,==第

  • springboot 使用自定义的aspect的示例代码

    对某个类型中的方法进行拦截,然后加入固定的业务逻辑,这是AOP面向切面编程可以做的事,在springboot里实现aop的方法也有很多, spring-boot-starter-aop 或者 aspectjweaver 都是可以实现的,不过我们在实现之前,先来看一下aop里的几个概念. 概念 切面(Aspect):是指横切多个对象的关注点的一个模块化,事务管理就是J2EE应用中横切关注点的很好示例.在Spring AOP中,切面通过常规类(基本模式方法)或者通过使用了注解@Aspect的常规类来

  • Spring Boot使用Value注解给静态变量赋值的方法

    昨天在使用@Value注解给静态变量赋值的时候,发现静态变量的值始终是null.后来搜索一下得知其中原因,Spring Boot 不允许/不支持把值注入到静态变量中.但是我们可以变通一下解决这个问题.因为Spring Boot 支持set方法注入,我们可以利用非静态set方法注入静态变量.废话不多说,贴上我昨天写的代码: @Component public class CoverImageUtil { private static String endpoint; private static

  • Spring boot + thymeleaf 后端直接给onclick函数赋值的实现代码

    这里是控制器里返回的 /** * @param pageUtil 分页工具类 * @param cliCorpQuery 查询类 * @param model model * @return String */ @RequestMapping(value = {"/list"}, method = RequestMethod.GET) public String list(PageUtil<CliCorp> pageUtil, CliCorpQuery cliCorpQue

  • 详解SpringBoot AOP 拦截器(Aspect注解方式)

    常用用于实现拦截的有:Filter.HandlerInterceptor.MethodInterceptor 第一种Filter属于Servlet提供的,后两者是spring提供的,HandlerInterceptor属于Spring MVC项目提供的,用来拦截请求,在MethodInterceptor之前执行. 实现一个HandlerInterceptor可以实现接口HandlerInterceptor,也可以继承HandlerInterceptorAdapter类,两种方法一样.这个不在本文

  • spring boot空属性赋值问题与aspect日志实现方法

    空属性赋值问题 MyBeanUtils类 public class MyBeanUtils { public static String[] getNullPropertyNames(Object source){ BeanWrapper beanWrapper=new BeanWrapperImpl(source); PropertyDescriptor[] pds=beanWrapper.getPropertyDescriptors(); List<String> nullProperty

  • Spring Boot 与 Kotlin 使用JdbcTemplate连接MySQL数据库的方法

    之前介绍了一些Web层的例子,包括构建RESTful API.使用Thymeleaf模板引擎渲染Web视图,但是这些内容还不足以构建一个动态的应用.通常我们做App也好,做Web应用也好,都需要内容,而内容通常存储于各种类型的数据库,服务端在接收到访问请求之后需要访问数据库获取并处理成展现给用户使用的数据形式. 本文介绍在Spring Boot基础下配置数据源和通过 JdbcTemplate 编写数据访问的示例. 数据源配置 在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同

  • Spring Boot Maven 打包可执行Jar文件的实现方法

    Maven pom.xml 必须包含 <packaging>jar</packaging> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>

  • Spring Boot 自定义 Shiro 过滤器无法使用 @Autowired问题及解决方法

    在 Spring Boot 中集成 Shiro,并使用 JWT 进行接口认证. 为了统一对 Token 进行过滤,所以自定义了一个 JwtTokenFilter 过滤器. 期间遇到了以下几个问题,这里逐一进行记录,以备日后查阅. 问题一:JwtTokenFilter 无法使用 @Autowired 因为自定义了一个 JWT Token 工具类,用来解析和创建 Token,JwtTokenFilter 中需要用到此工具类,这里本来可以直接手动进行 new 一个新的实例,但由于在 Spring 配置

  • Spring Boot详解各类请求和响应的处理方法

    目录 1. HttpServletRequest与HttpServletResponse 2. GET类型的请求 2.1 /students?current=1&limit=20 2.2 /student/123 3. POST类型的请求 4. 响应HTML格式的数据 4.1 使用ModelAndView 4.2 使用Model 5. 响应JSON格式的数据 5.1 单组数据 5.2 多组数据 1. HttpServletRequest与HttpServletResponse 浏览器输入:htt

  • spring boot加载第三方jar包的配置文件的方法

    前言 今天收到一封邮件,大概内容如下:spring boot鼓励去配置化,那么怎么将第三方jar包中的xml去配置化了? 其实,这个问题,在前面的文章中也有提到,http://www.jb51.net/article/125700.htm 下面,我们就以Quartz定时任务为例,单独对这个问题来进行说明,如何实现去配置化. 如果不使用spring boot,我们配置一个简单的定时任务时,需要引入以下配置文件: <!-- 配置需要定时执行的任务类以及方法 --> <bean id=&quo

  • Spring Boot与Kotlin处理Web表单提交的方法

    我们在做web开发的时候,肯定逃不过表单提交,这篇文章通过Spring Boot使用Kotlin 语言 创建和提交一个表单. 下面我们在之前<Spring Boot 与 Kotlin使用Freemarker模板引擎渲染web视图>项目的基础上,增加处理表单提交. build.gradle 文件没有变化,这里贴一下完整的build.gradle group 'name.quanke.kotlin' version '1.0-SNAPSHOT' buildscript { ext.kotlin_v

  • Spring boot项目打包成jar运行的二种方法

    前言 最近公司有个项目需要移植到SpringBoot框架上,项目里面又有许多第三方jar包,在linux服务器上最方便的就是用jar的方式来运行SpringBoot项目了,因此我研究了2种打jar包的方式,记录如下,供大家参考: 1.通过maven插件,将所有依赖包都打包成一个jar包,然后通过java -jar xxx.jar方式运行 由于项目中有些jar包是第三方的,maven官方仓库没有,需要使用mvn install命令打包到本地,然后将其写入到pom.xml的依赖中,maven仓库有的

  • Spring Boot系列教程之7步集成RabbitMQ的方法

    前言 RabbitMQ是一种我们经常使用的消息中间件,RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗.RabbitMQ主要是为了实现系统之间的双向解耦而实现的.当生产者大量产生数据时,消费者无法快速消费,那么需要一个中间层.保存这个数据. AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件

  • 使用spring boot通过自定义注解打印所需日志

    spring boot自定义注解打印日志 在实际项目中可能需要监控每个接口的请求时间以及请求参数等相关信息,那么此时我们想到的就是两种实现方式,一种是通过拦截器实现,另一种则通过AOP自定义注解实现. 本文介绍自定义注解实现方式 自定义注解,四个元注解这次就不解释了. @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface WebLog { /** * 日志信息描述 */ String d

随机推荐