Java 为我的所有REST控制器方法添加@Around建议后,请求don';不返回任何JSON数据
我已经实现了REST控制器方法,当没有实现方面时,它们工作得很好。 在我实现方面之后,控制器方法在后台仍然可以很好地执行(即删除请求实际上会删除条目),但是当我使用Postman测试响应时,我没有得到任何响应。方面确实起作用,当调用方法时,txt文件会更新Java 为我的所有REST控制器方法添加@Around建议后,请求don';不返回任何JSON数据,java,spring,spring-boot,spring-aop,spring-rest,Java,Spring,Spring Boot,Spring Aop,Spring Rest,我已经实现了REST控制器方法,当没有实现方面时,它们工作得很好。 在我实现方面之后,控制器方法在后台仍然可以很好地执行(即删除请求实际上会删除条目),但是当我使用Postman测试响应时,我没有得到任何响应。方面确实起作用,当调用方法时,txt文件会更新 @RestController public class MovieScreeningREST { @Autowired private MovieScreeningService movieScreeningService; @Get
@RestController
public class MovieScreeningREST {
@Autowired
private MovieScreeningService movieScreeningService;
@GetMapping("/movies")
public List<MovieScreening> findAll(){
return movieScreeningService.findAll();
}
@GetMapping("/movies/genre={movieGenre}")
public List<MovieScreening> findAllByMovieGenre(@PathVariable String movieGenre){
return movieScreeningService.findAllByMovieGenre(movieGenre);
}
@GetMapping("/movies/minimum-tickets={amount}")
public List<MovieScreening> findAllByTicketsSoldGreaterThanEqual(@PathVariable int amount){
return movieScreeningService.findAllByTicketsSoldGreaterThanEqual(amount);
}
@GetMapping("/movies/maximum-screenings={amount}")
public List<MovieScreening> findAllByScreeningsNumberLessThanEqual(@PathVariable int amount){
return movieScreeningService.findAllByScreeningsNumberLessThanEqual(amount);
}
@GetMapping("/movies/id={id}")
public MovieScreening findById(@PathVariable int id){
return movieScreeningService.findById(id);
}
@PostMapping("/movies")
public MovieScreening addMovieScreening(@RequestBody MovieScreening movieScreening){
return movieScreeningService.save(movieScreening);
}
@PutMapping("/movies")
public MovieScreening editMovieScreening(@RequestBody MovieScreening movieScreening){
return movieScreeningService.save(movieScreening);
}
@DeleteMapping("/movies/id={id}")
public String deleteMovieScreening(@PathVariable int id){
return movieScreeningService.deleteById(id);
}
}
around通知返回的值是
方法的调用方
您的建议不会返回任何阻止调用方法获取实际返回值的内容。修改around advice方法以返回对象
,从而正确完成流程
范例
@Around("allRESTMethods()")
public Object blabla(ProceedingJoinPoint pjp) {
//@Before
String methodName = pjp.getSignature().getName();
String before = "*** Attempting " + methodName + " method ***";
writeLog(before);
Object retVal = null;
try {
//@AfterReturning
retVal = pjp.proceed();
String success = "\n*** Method " + methodName + " has succeeded";
writeLog(success);
} catch (Throwable throwable){
//@AfterThrowing
String failed = "\n*** Method " + methodName
+ " has failed. " + throwable.getMessage() + " .***";
writeLog(failed);
}
//@After
String after = "\n";
writeLog(after);
return retVal;
}
一个Spring AOP
@Around
返回的通知void
甚至与返回其他内容的方法相匹配,这是令人惊讶的,也是有点出乎意料的。在AspectJ中,我希望该方面甚至不会被触发。这似乎是SpringAOP和AspectJ之间微妙的语义差异之一,尽管前者使用后者的库来匹配切入点。我真想知道为什么春天的人们会做出不同的选择,这是否是一个深思熟虑的选择。对于调试而言,不匹配的建议比返回null
的匹配建议更好。
@Around("allRESTMethods()")
public Object blabla(ProceedingJoinPoint pjp) {
//@Before
String methodName = pjp.getSignature().getName();
String before = "*** Attempting " + methodName + " method ***";
writeLog(before);
Object retVal = null;
try {
//@AfterReturning
retVal = pjp.proceed();
String success = "\n*** Method " + methodName + " has succeeded";
writeLog(success);
} catch (Throwable throwable){
//@AfterThrowing
String failed = "\n*** Method " + methodName
+ " has failed. " + throwable.getMessage() + " .***";
writeLog(failed);
}
//@After
String after = "\n";
writeLog(after);
return retVal;
}