在为我的所有 REST 控制器方法请求添加 @Around 建议后,不要 return 任何 JSON 数据
After adding @Around advice for all of my REST Controller methods request don't return any JSON data
我已经实现了 REST 控制器方法,它们在没有实现方面时工作正常。
在我实现方面之后,控制器方法在后台仍然执行良好(即 DELETE 请求实际上删除了条目),但是当我使用 Postman 测试响应时,我没有得到任何响应。方面确实有效,并且在调用方法时更新 txt 文件。
@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);
}
}
看点class
@EnableAspectJAutoProxy
@Aspect
@Component
public class Logger {
@Pointcut("execution(* asss.pj.projekat_bioskop.controller.*.*(..))")
public void allRESTMethods(){};
@Around("allRESTMethods()")
public void blabla(ProceedingJoinPoint pjp) {
//@Before
String methodName = pjp.getSignature().getName();
String before = "*** Attempting " + methodName + " method ***";
writeLog(before);
try {
//@AfterReturning
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);
}
public void writeLog(String log){
File file = new File("filmovi_izvestaj.txt");
try (Writer wr = new FileWriter(file, true)){
wr.write(log);
} catch(FileNotFoundException fe){
fe.printStackTrace();
} catch(IOException ioe){
ioe.printStackTrace();
}
}
}
Postman
The value returned by the around advice is the return value seen by
the caller of the method.
您的建议不是 returning 任何阻止调用方法获取实际 return 值的东西。将您的周围建议方法修改为 return Object
以正确完成流程。
例子
@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;
}
我已经实现了 REST 控制器方法,它们在没有实现方面时工作正常。 在我实现方面之后,控制器方法在后台仍然执行良好(即 DELETE 请求实际上删除了条目),但是当我使用 Postman 测试响应时,我没有得到任何响应。方面确实有效,并且在调用方法时更新 txt 文件。
@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);
}
}
看点class
@EnableAspectJAutoProxy
@Aspect
@Component
public class Logger {
@Pointcut("execution(* asss.pj.projekat_bioskop.controller.*.*(..))")
public void allRESTMethods(){};
@Around("allRESTMethods()")
public void blabla(ProceedingJoinPoint pjp) {
//@Before
String methodName = pjp.getSignature().getName();
String before = "*** Attempting " + methodName + " method ***";
writeLog(before);
try {
//@AfterReturning
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);
}
public void writeLog(String log){
File file = new File("filmovi_izvestaj.txt");
try (Writer wr = new FileWriter(file, true)){
wr.write(log);
} catch(FileNotFoundException fe){
fe.printStackTrace();
} catch(IOException ioe){
ioe.printStackTrace();
}
}
}
Postman
The value returned by the around advice is the return value seen by the caller of the method.
您的建议不是 returning 任何阻止调用方法获取实际 return 值的东西。将您的周围建议方法修改为 return Object
以正确完成流程。
例子
@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;
}