用' @Async'注释的方法必须是可以覆盖的

时间:2017-10-06 13:56:07

标签: java spring hibernate intellij-idea

Intellij显示红色下划线。
当鼠标悬停到红色下划线时,显示此消息。

  

使用' @Async'注释的方法必须是可以覆盖的

     

报告代码阻止类出现的情况   在运行时由某个框架(例如Spring或Hibernate)子类化

我应该怎样做才能消除此错误?
它显示红色下划线。但它仍然没有编译错误。

我正在使用Intellij 2017.2.5。

@Async
private void deleteFile(String fileName, String path) {
    BasicAWSCredentials credentials = new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY);
    AmazonS3 s3client = AmazonS3ClientBuilder.standard().withRegion("ap-northeast-2").withCredentials(new AWSStaticCredentialsProvider(credentials)).build();

    try {
        s3client.deleteObject(new DeleteObjectRequest(AWS_BUCKET_NAME, path + fileName));
    } catch (AmazonServiceException ase) {
        System.out.println("Caught an AmazonServiceException.");
        System.out.println("Error Message:    " + ase.getMessage());
        System.out.println("HTTP Status Code: " + ase.getStatusCode());
        System.out.println("AWS Error Code:   " + ase.getErrorCode());
        System.out.println("Error Type:       " + ase.getErrorType());
        System.out.println("Request ID:       " + ase.getRequestId());
    } catch (AmazonClientException ace) {
        System.out.println("Caught an AmazonClientException.");
        System.out.println("Error Message: " + ace.getMessage());
    }
}

2 个答案:

答案 0 :(得分:1)

错误表示private必须是protected cq。 public,因为异步性。

然后没有看到Async工具使用此方法。只需添加SuppressWarnings,说明您知道自己在做什么。

@Async
@SuppressWarnings("WeakerAccess")
protected void deleteFile(String fileName, String path) {

您可以向IntelliJ团队提示。

答案 1 :(得分:1)

@Async表示Spring异步执行此方法。所以它只能在几个条件下工作:

  1. 该课程必须由Spring管理
  2. 该方法必须公开
  3. 必须使用Spring
  4. 调用该方法

    对于后者,似乎你直接在你的类中调用这个方法,所以Spring无法知道你调用了这个方法,它不是魔法。

    您应该重构代码,以便在Spring管理的bean上调用该方法,如下代码所示:

    @Service
    public class AsyncService {
        @Async
        public void executeThisAsync() {...}
    }
    
    @Service
    public class MainService {
        @Inject
        private AsyncService asyncService;
    
        public mainMethod() {
            ...
            // This will be called asynchronusly
            asyncService.executeThisAsync();
        }
        ...
    }