Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为我的所有REST控制器方法添加@Around建议后,请求don';不返回任何JSON数据_Java_Spring_Spring Boot_Spring Aop_Spring Rest - Fatal编程技术网

Java 为我的所有REST控制器方法添加@Around建议后,请求don';不返回任何JSON数据

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

我已经实现了REST控制器方法,当没有实现方面时,它们工作得很好。 在我实现方面之后,控制器方法在后台仍然可以很好地执行(即删除请求实际上会删除条目),但是当我使用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);
}
}

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;
}