簡體   English   中英

Hystrix:如何執行@Requestparam和bean驗證?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM