[英]Hystrix: how to perform @Requestparam and bean validation?
我試圖通過使用JSR-303 bean驗證在我的rest控制器上執行一些參數驗證。 但是,當我使用@HystrixCommand
批注對我的方法進行批注時,將忽略所有驗證。
例如 :
@RestController
@Validated
public class TestController {
//This method ignore all validations :(, even if age < 10
@HystrixCommand(fallbackMethod = "fallback")
@RequestMapping(value = "/notok", method = RequestMethod.GET)
ResponseEntity<String> methodNotOk(
HttpServletRequest request,
@Min(10) @RequestParam(name = "age") final int age
) {
return ResponseEntity.ok("Age is " + age);
}
//This method will raised an error if age < 10, because of the age validation.
//This is the expected behavior
@RequestMapping(value = "/ok", method = RequestMethod.GET)
ResponseEntity<String> methodOk(
HttpServletRequest request,
@Min(10) @RequestParam(name = "age") final int age
) {
return ResponseEntity.ok("Age is " + age);
}
//Hystrix fallback
private ResponseEntity<String> fallback(HttpServletRequest request, @RequestParam("age") final int age, Throwable e) {
return ResponseEntity.badRequest().body("error");
}
}
對於methodNotOk
,完全忽略@Min
注釋,因此服務器可以響應Age is 5
,這對於此測試用例是不正確的。
但是,如果我刪除了@HystrixCommand
,那么就像發條一樣。
所以問題是如何在使用@HystrixCommand
時驗證一些方法參數?
謝謝您的幫助
我有同樣的問題,我沒有在互聯網上找到任何東西。
我認為原因是加載Aspects的順序(HystrixCommandAspect在加載Validator之前創建Bean的代理),但我找不到使用Spring的Java配置更改它的方法
我的最后一招是使用@HystrixCommand將邏輯移動到另一個Bean,然后在Controller中使用委托模式
@RestController
@Validated
public class TestController {
@Autowired
private TestHystrixController delegate;
@RequestMapping(value = "/notok", method = RequestMethod.GET)
ResponseEntity<String> methodNotOk(HttpServletRequest request,
@Min(10) @RequestParam(name = "age") final int age) {
return delegate.methodNotOk(request, age);
}
}
@Controller
class TestHystrixController {
@HystrixCommand(fallbackMethod = "fallback")
ResponseEntity<String> methodNotOk(HttpServletRequest request,
final int age) {
return ResponseEntity.ok("Age is " + age);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.