我想配置并使用Spring 4.1 AsyncUncaughtExceptionHandler。根据Spring团队(see relevant comment here),您可以使用AsyncUncaughtExceptionHandler
或通过实施<task:annotation-driven>
来配置AsyncConfigurer
,如下所示:
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new SimpleAsyncUncaughtExceptionHandler() ;
}
现在我的问题如下:是否有另一个类似于@ExceptionHandler
的网络图层注释,它会像AsyncUncaughtExceptionHandler
一样工作?
答案 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处理,因此您可以使用与请求映射相同的方式呈现视图。