- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一种情况,在处理输入文件之前,我想检查数据库中是否设置了某些信息。在这种特殊情况下,它是用于处理的客户端名称和参数。如果不设置该信息,则文件导入失败。
在许多 StackOverflow 页面中,用户通过在 Java 代码中捕获由 queryForObject 不返回任何行而生成的 EmptyResultDataAccessException 异常来解决这些异常。
问题是 Spring Integration 在我的代码捕获异常之前就捕获了它,理论上,我无法从任何数量的 EmptyResultDataAccessException 异常中分辨出这个错误,这些异常可能与代码中的其他查询一起抛出。
显示 try...catch with queryForObject 的示例代码段:
MapSqlParameterSource mapParameters = new MapSqlParameterSource();
// Step 1 check if client exists at all
mapParameters.addValue("clientname", clientName);
try {
clientID = this.namedParameterJdbcTemplate.queryForObject(FIND_BY_NAME, mapParameters, Long.class);
} catch (EmptyResultDataAccessException e) {
SQLException sqle = (SQLException) e.getCause();
logger.debug("No client was found");
logger.debug(sqle.getMessage());
return null;
}
return clientID;
在上面的代码中,没有返回任何行,我想正确处理它(我还没有对那部分进行编码)。相反,永远不会触发 catch block ,而是触发我的通用错误处理程序和关联的错误 channel 。
来自文件 BatchIntegrationConfig.java 的片段:
@Bean
@ServiceActivator(inputChannel="errorChannel")
public DefaultErrorHandlingServiceActivator errorLauncher(JobLauncher jobLauncher){
logger.debug("====> Default Error Handler <====");
return new DefaultErrorHandlingServiceActivator();
}
来自文件 DefaultErrorHandlingServiceActivator.java 的片段:
public class DefaultErrorHandlingServiceActivator {
@ServiceActivator
public void handleThrowable(Message<Throwable> errorMessage) throws Throwable {
// error handling code should go here
}
}
测试事实:
我想做的事情:
根据@Artem 的建议于 2016 年 10 月 26 日编辑:
将我现有的输入 channel 更改为 Spring 提供的处理程序建议:
@Transformer(inputChannel = "memberInputChannel", outputChannel = "commonJobGateway", adviceChain="handleAdvice")
为通知添加了支持Bean和方法:
@Bean
ExpressionEvaluatingRequestHandlerAdvice handleAdvice() {
ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
advice.setOnFailureExpression("payload");
advice.setFailureChannel(customErrorChannel());
advice.setReturnFailureExpressionResult(true);
advice.setTrapException(true);
return advice;
}
private QueueChannel customErrorChannel() {
return new DirectChannel();
}
我最初在连接此功能时遇到了一些问题,但最后,我意识到它正在创建另一个 channel ,需要监视错误并进行适当处理。为简单起见,我选择此时不使用其他 channel 。
最佳答案
虽然可能不是最好的解决方案,但我转而检查行数而不是返回实际数据。这样就避免了数据异常。
上面的主要代码移到了:
MapSqlParameterSource mapParameters = new MapSqlParameterSource();
mapParameters.addValue("clientname", clientName);
// Step 1 check if client exists at all; if exists, continue
// Step 2 check if client enrollment rules are available
if (this.namedParameterJdbcTemplate.queryForObject(COUNT_BY_NAME, mapParameters, Integer.class) == 1) {
if (this.namedParameterJdbcTemplate.queryForObject(CHECK_RULES_BY_NAME, mapParameters, Integer.class) != 1) return null;
} else return null;
return findClientByName(clientName);
然后我在返回到 Spring Batch 中的调用方法时检查数据:
if (clientID != null) {
logger.info("Found client ID ====> " + clientID);
}
else {
throw new ClientSetupJobExecutionException("Client " +
fileNameParts[1] + " does not exist or is improperly setup in the database.");
}
虽然不需要,但我创建了一个自定义 Java 异常,它在以后的某个时间点可能会有用。
关于java - 您如何使用 Spring Integration 处理 EmptyResultDataAccessException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40246251/
@Spring:我写了一个 Dao,它通过另一个 id 找到一个 id。当它获得数据时它很好但是当找不到时显示这样的异常。 org.springframework.dao.EmptyResultDat
@Spring:我写了一个 Dao,它通过另一个 id 找到一个 id。当它获得数据时它很好但是当找不到时显示这样的异常。 org.springframework.dao.EmptyResultDat
这在我脑海中持续了很长时间,我仍然想知道为什么 spring jdbc 将 EmptyResultDataAccessException 作为运行时异常,而不是强制调用方法(通过生成异常)来捕获 Em
我有一个 SQL 语句,我希望它返回一行,因为我正在传递主键。所以我的选择是 将 queryForObject 包装在 try/catch 中,捕获 EmptyResultDataAccessExce
我正在为一个大学项目编写一个简单的库 API。我有一个包含书籍的数据库,每本书都有自己的 ID。我正在使用 Spring Boot 来提供服务。我有一个 BookRepository延伸JpaRepo
我正在尝试使用jdbcTemplate.queryForObject将普通查询更改为参数化查询,以避免SQL注入(inject)。但查询返回 EmptyResultDataAccessExceptio
我有一种情况,在处理输入文件之前,我想检查数据库中是否设置了某些信息。在这种特殊情况下,它是用于处理的客户端名称和参数。如果不设置该信息,则文件导入失败。 在许多 StackOverflow 页面中,
我想知道在我的应用程序中处理 org.springframework.dao.EmptyResultDataAccessException 的最佳方法是什么。 当我尝试从不存在的数据库中选择记录时会发
将 Kotlin 和 Spring 5 用于一些简单的项目。 我想使用 queryForObject 通过 id 从数据库中获取单条记录. 我的查询是“按 id 进行简单选择”: jdbc.query
springframework.dao.EmptyResultDataAccessException 在尝试从 sql server 数据库中选择数据时,这是我编写的代码。谁能建议如何使用查询界面从数
问题 我在 Spring Boot 中有一个带有 JPA 和 Spring Security 的 REST API。当我尝试按 ID 删除数据库中的现有用户对象时,收到以下错误消息: org.spri
我正在使用 Jdbctemplate 从数据库中检索单个字符串值。这是我的方法。 public String test() { String cert=null;
我收到一个错误 org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, a
这个问题已经有答案了: Jdbctemplate query for string: EmptyResultDataAccessException: Incorrect result size: ex
执行时 private static final String CURRENT_VERSION_JOB_EXECUTION = "SELECT VERSION FROM %PREFIX%JOB_EXE
我是一名优秀的程序员,十分优秀!