将自定义对象作为Micronaut http方法(@ Get,@ Post,..)中的参数进行绑定

时间:2019-12-04 12:40:26

标签: micronaut

在我的应用中,我有一个自定义Auth对象,该对象已设置为过滤器中的请求参数。

那里没有问题,但是现在我所有的控制者都看起来像

@Controller("/path")
public class MyController {

  @Get
  public Whatever get(HttpRequest<?> request) {
    Auth auth = request.getAttribute(SomeClass.AUTH_ATTRIBUTE_NAME);
    // code code code
  }

  @Post
  public Whatever post(HttpRequest<?> request, @Body SomePojo body) {
    Auth auth = request.getAttribute(SomeClass.AUTH_ATTRIBUTE_NAME);
    // code code code
  }

}

我真的很想以某种方式“教” micronaut如何将Auth像文档中的HttpRequestHttpHeaders和其他Table 1. Bindable Micronaut Interfaces一样对待。

基本上我想将以上内容转为:

@Controller("/path")
public class MyController {

  @Get
  public Whatever get(Auth auth) {
    // code code code
  }

  @Post
  public Whatever post(Auth auth, @Body SomePojo body) {
    // code code code
  }

}

有办法吗?

我正在使用Micronaut 1.2.7。我尝试过

@Singleton
class AuthTypeConverterRegistrar implements TypeConverterRegistrar {
    @Override
    public void register(ConversionService<?> conversionService) {
        conversionService.addConverter(HttpRequest.class, Auth.class, request -> {
            return request.getAttribute("").map(Auth.class::cast).orElse(Auth.anonymous());
        });
    }
}

但是它似乎没有我希望的那样。

1 个答案:

答案 0 :(得分:2)

您需要注册TypedRequestArgumentBinder bean。

您可以查看SessionArgumentBinder作为此操作的示例,因为会话也只是一个请求属性。