使用@ExceptionHandler或其他一些类似于Spring 4.1 AsyncUncaughtExceptionHandler的注释

时间:2014-06-21 05:24:25

标签: spring spring-mvc

我想配置并使用Spring 4.1 AsyncUncaughtExceptionHandler。根据Spring团队(see relevant comment here),您可以使用AsyncUncaughtExceptionHandler或通过实施<task:annotation-driven>来配置AsyncConfigurer,如下所示:

@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
 return new SimpleAsyncUncaughtExceptionHandler() ;
}

现在我的问题如下:是否有另一个类似于@ExceptionHandler的网络图层注释,它会像AsyncUncaughtExceptionHandler一样工作?

1 个答案:

答案 0 :(得分:1)

正如评论中所述,这是我采取的一种方法:

关于异步数据导入,所有类都称为导入...

我还没有做的事情是未被捕获的异常处理,但阅读你的帖子让我思考它并且应该直接用Spring-AOP包装 Importer.process()方法。这不是全局解决方案,但它可以通过使用更通用的结果对象来适应完整的应用程序。

控制器使用 ImportRequests 来处理(或完成)处理(或完成)消息。 导入程序本身不会从地图中删除结果,而是将其委派给控制器(用户单击删除)。我们还有一个 @Scheduled 任务,可以在1小时后清除完成的结果,以确保没有遗留。

以下是控制器能够在处理过程中获取导入结果的代码的一部分:

@Service
public class ImportRequests {
    private final Map<User, ImportResult> importRequests = new ConcurrentHashMap<>();

    /** Add, remove, get methods for current user omitted */
}

public class ImportResult {
    /** The done. */
    private Future<Boolean> done;
    /** The error messages. */
    private List<String> messages = Collections.synchronizedList(new ArrayList<String>());;

}

@Service
public class ImportService {
    @Autowired
    private ImportRequests importRequests;

    @Autowired
    private Importer importer;

    public ImportResult doImport(final ImportForm importForm) {
        ImportResult result = new ImportResult();
        importRequests.addImportResultForCurrentUser(result);

        /* This is the actual Async call (process) */
        result.setDone(importer.process(result));
        return result;
    }

}

@Service
public class ImporterImpl implements Importer {
    /**
     * doProcess will import the *big* file and update the result object with the necessary messages
     */
    @Async
    public Future<Boolean> process(ImportResult result) {
        Boolean done = doProcess(result);
        return new AsyncResult<Boolean>(done);
    }
}

希望这有帮助。


原文:

我使用的一种可能性是&#34; @ControllerAdvice&#34;在servletcontext扫描的类上。

您只需创建一个方法,将异常作为参数,并使用&#34; @ ExceptionHandler&#34;注释该方法。您甚至可以为特定的异常类型提供多个处理程序。

这些方法的结果再次由DispatcherServlet处理,因此您可以使用与请求映射相同的方式呈现视图。