常用登录方法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
对象的“响应”。我不确定你应该那样做。但这与重构问题本身无关。
这是我的控制器 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 classpublic 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
对象的“响应”。我不确定你应该那样做。但这与重构问题本身无关。