Search code examples
javaspringspring-bootspring-aopspring-rest

After adding @Around advice for all of my REST Controller methods request don't return any JSON data


I've implemented REST Controller methods and they work fine when there is no aspects implemented. After I implement aspects, controller methods still execute fine in background(i.e DELETE request actually deletes entries), but when i'm testing responses with Postman, i don't get any responses. Aspects do work, and txt file gets updated when methods get invoked.

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

}

Aspect 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


Solution

  • @Around Advice

    The value returned by the around advice is the return value seen by the caller of the method.

    Your advice is not returning anything which prevents the calling method to get the actual return value. Modify your around advice method to return Object to complete the flow correctly.

    Example

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