常用登录方法Spring-boot

Common method for logging in Spring-boot

这是我的控制器 class 用于 GetMapping 和 PostMapping

public class Controller{
    @CrossOrigin(origins = "*")
    @PostMapping(value = "/tran", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Map<String,Object>> createTransaction(@RequestHeader(required = false,name="request-id") String requestId,
                                                @RequestHeader(required = false,name="request-datetime") String requestDate,
                                                @RequestHeader(required = false,name= "request-channel") String requestChannel,
                                                @RequestBody TransactionRequestEntity createTransactionRequest,
                                                HttpServletRequest req) throws Exception {

///// Some Code /////

    }

    @CrossOrigin(origins = "*")
    @GetMapping(value = "/getTran", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Map<String,Object>> getByTransactionId(@RequestHeader(required = false,name="request-id") String requestId,
                                     @RequestHeader(required = false,name="request-datetime") String requestDate,
                                     @RequestHeader(required = false,name= "request-channel") String requestChannel,
                                     @RequestParam(name="transactionId") String transactionId,
                                     @RequestParam(name="transactionSource") TransactionSourceEnum transactionSource,
                                     HttpServletRequest req) throws Exception {

///// Some Code /////

    }
}

这是上述 PostMapping 和 GetMapping

的 LoggingAspect class
public class LoggingAspect {
    private static final ch.qos.logback.classic.Logger LOGGER = LoggingUtils.getLogger(LoggingAspect.class.getName());

    @Around("@annotation(org.springframework.web.bind.annotation.PostMapping) && args(.., @RequestHeader header1,@RequestHeader header2,@RequestHeader header3, @RequestBody body, request)")
    public Object logPostMethod(ProceedingJoinPoint joinPoint, String header1,String header2,String header3, Object body, HttpServletRequest request) throws Throwable {
        LOGGER.info("Start {} {} :  Request Id : {} : Request DateTime: {}: Request Channel : {} ", request.getMethod(), request.getRequestURI(), header1,header2,header3);
        ObjectMapper mapper = new ObjectMapper();
        String jsonString = mapper.writeValueAsString(body);
        LOGGER.debug("{} {} : Request Body : {}", request.getMethod(), request.getRequestURI(), jsonString);
        Object result;
        result = joinPoint.proceed();
        LOGGER.debug("End {} {} : Response: {}", request.getMethod(), request.getRequestURI(), result);
        String response = mapper.writeValueAsString(result);
        JSONParser parser = new JSONParser();
        JSONObject responseHeader = (JSONObject) ((JSONObject) ((JSONObject) parser.parse(response)).get("body")).get("responseHeader");
        LOGGER.info("End {} {} : Response Header : {}", request.getMethod(), request.getRequestURI(), responseHeader);

        return result;
    }

    @Around("@annotation(org.springframework.web.bind.annotation.GetMapping) && args(.., @RequestHeader header1,@RequestHeader header2,@RequestHeader header3, @RequestParam param1,@RequestParam param2 , request)")
    public Object logGetMethod(ProceedingJoinPoint joinPoint, String header1, String header2, String header3 ,String param1, TransactionSourceEnum param2 , HttpServletRequest request) throws Throwable {
        LOGGER.info("Start {} {} :  Request Id : {} :Request DateTime : {} :Request Channel : {} : Request Transaction Id : {} : Transaction Source : {} ", request.getMethod(), request.getRequestURI(), header1,header2,header3,param1,param2);
        ObjectMapper mapper = new ObjectMapper();

        Object result;
        result = joinPoint.proceed();
        LOGGER.debug("End {} {} : Response: {}", request.getMethod(), request.getRequestURI(), result);
        String response = mapper.writeValueAsString(result);
        JSONParser parser = new JSONParser();
        JSONObject responseHeader = (JSONObject) ((JSONObject) ((JSONObject) parser.parse(response)).get("body")).get("responseHeader");
        LOGGER.info("End {} {} : Response Header : {}", request.getMethod(), request.getRequestURI(), responseHeader);

        return result;
    }
}

代码运行没有任何问题....但是有重复的行。我想删除重复项。那么上面的GetMapping和PostMapping的通用方法怎么写呢

您的工作量很大。

这是我的做法:

声明注释:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Logged {
        
}

声明你的看点:

@Aspect
@Configuration
public class Logger {
      
@Around("@annotation(fully.qualified.name.of.Logged)")
public Object log(ProceedingJoinPoint joinPoint) {
   // get request object
   HttpServletRequest req = 
      ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())
      .getRequest();
   //do whatever you've to do with your req object
   //process further
   return someobject
}

你控制器class:

public class Controller{
          
@Logged //<-- Just a single annotation at your controller. This can be applied on all other methods irrespective of HTTP methods
        
@CrossOrigin(origins = "*")
@PostMapping(value = "/tran", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Map<String,Object>> createTransaction(...........) {

  }

为什么不直接将公共代码提取到辅助方法中,然后从两个建议方法中调用它?我没有对此进行测试,因为我不想从头开始使用 Logback 和 Spring 创建一个测试项目来解决导入问题,但基本上是这样的:

@Around("@annotation(org.springframework.web.bind.annotation.PostMapping) && args(.., @RequestHeader header1,@RequestHeader header2,@RequestHeader header3, @RequestBody body, request)")
public Object logPostMethod(ProceedingJoinPoint joinPoint, String header1, String header2, String header3, Object body, HttpServletRequest request) throws Throwable {
  LOGGER.info("Start {} {} :  Request Id : {} : Request DateTime: {}: Request Channel : {} ", request.getMethod(), request.getRequestURI(), header1, header2, header3);
  LOGGER.debug("{} {} : Request Body : {}", request.getMethod(), request.getRequestURI(), new ObjectMapper().writeValueAsString(body));
  return proceedAndLogResult(joinPoint, request);
}

@Around("@annotation(org.springframework.web.bind.annotation.GetMapping) && args(.., @RequestHeader header1,@RequestHeader header2,@RequestHeader header3, @RequestParam param1,@RequestParam param2 , request)")
public Object logGetMethod(ProceedingJoinPoint joinPoint, String header1, String header2, String header3, String param1, TransactionSourceEnum param2, HttpServletRequest request) throws Throwable {
  LOGGER.info("Start {} {} :  Request Id : {} :Request DateTime : {} :Request Channel : {} : Request Transaction Id : {} : Transaction Source : {} ", request.getMethod(), request.getRequestURI(), header1, header2, header3, param1, param2);
  return proceedAndLogResult(joinPoint, request);
}

public Object proceedAndLogResult(ProceedingJoinPoint joinPoint, HttpServletRequest request) {
  Object result = joinPoint.proceed();
  LOGGER.debug("End {} {} : Response: {}", request.getMethod(), request.getRequestURI(), result);
  String response = new ObjectMapper().writeValueAsString(result);
  JSONObject responseHeader = (JSONObject) ((JSONObject) ((JSONObject) new JSONParser().parse(response)).get("body")).get("responseHeader");
  LOGGER.info("End {} {} : Response Header : {}", request.getMethod(), request.getRequestURI(), responseHeader);
  return result;
}

免责声明:

  • 我不是 Spring 用户,不会评论以您的方式记录对象是否有效,其他人更清楚。我只是专注于方面重构部分,因为你要求它。

  • 我也没有详细说明您的编码风格和非常具体的切入点签名,如果您想拦截签名略有不同的方法,这可能会中断。

有一件事对我来说似乎很奇怪,但我想提一下:您正在记录实际上取自 request 对象的“响应”。我不确定你应该那样做。但这与重构问题本身无关。