gpt4 book ai didi

java - Hystrix:验证失败时出现 HystrixBadRequestException

转载 作者:行者123 更新时间:2023-12-02 05:14:11 25 4
gpt4 key购买 nike

我试图了解 Hystrix 如何处理非故障错误和 HystrixBadRequestException ,特别是在验证领域。我对所有 bean 使用 JSR-303 bean 验证(Hibernate validator ):

public class User {
@Min(1L)
private Long id;

@NotNull
@Email
private String email;
}

public class UserValidator {
private Validator validator;

// Throw exception if the user is invalid; return void otherwise.
public void validateUser(User user) {
Set<ConstraintViolation<User>> violations = validator.validate(user);
if(!violations.isEmpty()) {
return new BadEntityException(violations);
}
}
}

// Hystrix command.
public class SaveUserCommand extends HystrixCommand<User> {
public User user;

public void doSaveUser(User user) {
this.user = user;
execute();
}

@Override
protected User run() {
// Save 'user' somehow
}

@Override
protected User getFallback() {
return null;
}
}

// My service client that uses my Hystrix command.
public class UserClient {
private SaveUserCommandFactory factory = new SaveUserCommandFactory();
private UserValidator validator = new UserValidator();

public User saveUser(User user) {
SaveUserCommand saveUserCommand = factory.newSaveUserCommand();
validator.validate(user);
user = saveUserCommand.doSaveUser(user);

return user;
}
}

虽然这应该工作,但我觉得HystrixBadRequestException是为此目的而创建的,并且我可以以某种方式放置 validator 命令内部(而不是外部)。根据文档,此异常适用于非错误异常,包括非法参数。我只是不知道如何将验证放入命令中并利用它(这样失败的验证就不会计入我的指标/统计数据)。

最佳答案

事实证明,您需要在 HystrixCommand 实现中抛出 HystrixBadRequestException 内部。就我而言,解决方案是将 validator 移至 SaveUserCommand#run() 方法中:

@Override
protected void run() {
try {
validator.validate(user);
// Save user somehow
} catch(BadEntityException bexc) {
log.error(bexc);
throw new HystrixBadRequestException("Hystrix caught a bad request.", bexc);
}
}

现在,如果验证失败,外部异常是 HystrixBadRequestException,并且它不会计入断路器统计信息或已发布的指标。

关于java - Hystrix:验证失败时出现 HystrixBadRequestException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27117309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com