发表于: 2020-08-06 23:33:29

1 2138


今天完成的事情: 

根据教程用aop记录controller的出参入参。

定义一个切入点:

@Pointcut("execution(* com.jnshu.controller.*Controller.*(..))")
private void logRecordArg(){};

使用环绕通知

/**
* 定义一个环绕通知记录controller出参入参
*/
@Around("logRecordArg()")
private Object getControllerLog(ProceedingJoinPoint point) {
//获取目标方法所在类的全限定名。
   String methodName=point.getSignature().getDeclaringType().getName();
   StringBuilder sb = null ;
   sb = new StringBuilder(300);
   // 类名+方法名
   String target = point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName();
   Object[] args = point.getArgs();
   String[] paramsName = ((MethodSignature) point.getSignature()).getParameterNames();

   sb.append(target).append(" 入参:【");
   if(args != null && paramsName != null && args.length > 0 && paramsName.length > 0) {
for (int i=0; i< paramsName.length; i++) {
sb.append(" ").append(paramsName[i]).append(" = ").append(args[i]).append(",");
       }
sb.deleteCharAt(sb.length()-1);
   }
sb.append("】");

   Object result = null;
   try {
result = point.proceed();
   } catch (Throwable throwable) {
throwable.printStackTrace();
       logger.error("错误信息",throwable.getMessage());
   }
sb.append(" 出参:【").append(result).append("】");
   // 记录日志
   logger.info(sb.toString());
   // 调用结果返回
   return result;

}

结果:


遇到的问题:

用下面方法查询作品详情的时候,返回的作品详情包括作品下面的留言,但是如果留言表没有数据的话,也就是没有游客留言的情况下,返回的作品对象是空,但是不可能因为没有留言而不能展示作品详情吧

!--查询这个作品下的所有留言-->
<select id="getWorksDetail" resultMap="worksDetail">
     select m.id mid ,
m.content mContent,
m.message_at messageAt,
m.status mStatus,
m.message_by mMessageBy,
w.id wid ,
w.name wName
from works w,message m
where m.works_id = w.id and w.id =#{id}
</select>
<resultMap id="worksDetail" type="com.jnshu.pojo.Works">
 <result property="id" column="wid"/>
 <result property="name" column="wName"/>
 <collection property="messageList" ofType="com.jnshu.pojo.Message">
   <result property="id" column="mid"/>
   <result property="content" column="mContent"/>
   <result property="messageTime" column="messageAt"/>
   <result property="touristName" column="mMessageBy"/>
   <result property="status" column="mStatus"/>
   <result property="worksId" column="wid"/>
 </collection>
</resultMap>
2020-08-06 21:56:52 [org.mybatis.logging.Logger:49] - JDBC Connection [com.mysql.jdbc.JDBC4Connection@795f28cf] will not be managed by Spring

2020-08-06 21:56:52 [org.apache.ibatis.logging.jdbc.BaseJdbcLogger:143] - ==>  Preparing: 

select m.id mid ,

m.content mContent,

m.message_at messageAt,

m.status mStatus,

m.message_by mMessageBy,

w.id wid ,

w.name wName 

from works w,message m where m.works_id = w.id and w.id =?

2020-08-06 21:56:52 [org.apache.ibatis.logging.jdbc.BaseJdbcLogger:143] - ==> Parameters: 1(Integer)
2020-08-06 21:56:52 [org.apache.ibatis.logging.jdbc.BaseJdbcLogger:143] - <== Total: 0

解决办法:再创一个单表查询作品表的方法,然后在controller里做判断,如果一对多查出来的作品对象是空的话就返回单表查询出来的作品对象,如果都是空的话就直接返回失败信息。

@GetMapping(value = "/works/{id}")
@ResponseBody
public Map<String, Object> showMessage(@PathVariable int id) {
Works worksMessage = worksDetailService.getWorksDetail(id);
   Works works=worksDetailService.selectWorksById(id);
   if (worksMessage == null) {
//如果一对多查询出来的作品详情(包含留言)是空就返回单表查询出来的作品详情(不包含留言)
       return Result.set(200, "查看作品详情成功", works);
   } else if(worksMessage!=null&&works!=null){
return Result.set(200, "查看作品详情成功",worksMessage);
   }else {
return Result.set(404,"展示作品详情失败");
   }
}

明天计划的事情:

继续理解接口设计规范。

了解aop的切面表达式。

继续理解springmvc的配置原理


收获:


返回列表 返回列表
评论

    分享到