Micronaut自动转换HTTP请求参数

时间:2019-01-11 13:06:21

标签: java type-conversion micronaut

我目前正在努力设置micronaut,以便将http请求uri中的参数自动转换为pojos。

具体地说,我想实现这样的目标:

@Controller
public class FooBarBazController {

    @Get("/{foo}/{bar}")
    public Baz doSomething(Foo foo, Bar bar) {
        return new Baz(foo, bar);
    }

}

假设FooBar可以从字符串值构造。

我从服务器获得的唯一响应是

{
  "_links": {
    "self": {
      "href": "/forever/young",
      "templated": false
    }
  },
  "message": "Required argument [Foo foo] not specified",
  "path": "/foo"
}

我已经尝试了以下方法:

  • 定义一个注册两个bean的@FactoryTypeConverter<String, Foo>TypeConverter<String, Bar>
  • 分别将参数定义为@QueryValue("foo")@QueryValue("bar")
  • 分别将参数定义为@PathVariable("foo")@PathVariable("bar")

这些似乎都没有帮助,而且我在网上找不到与我的问题类似的参考。

有人知道如何指示框架执行自动转换和绑定吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

如果您可以使用@PathVariable版的newly introduced 1.0.3,那么您已经准备就绪。

答案 1 :(得分:0)

对于Micronaut 1.3,唯一需要做的就是为TypeConverterFoo定义一个Bar

@Singleton
public class FooTypeConverter implements TypeConverter<String, Foo> {
    @Override
    public Optional<Foo> convert(String fooString, Class<Foo> targetType, ConversionContext context) {
        return new Foo(fooString);
    }
}

...

@Singleton
public class BarTypeConverter implements TypeConverter<String, Bar> {
    @Override
    public Optional<Bar> convert(String barString, Class<Bar> targetType, ConversionContext context) {
        return new Bar(fooString);
    }
}

就是这样。

然后,在控制器中,您可以像Micronaut知道的其他任何类型一样使用FooBar

@Get("/foo/{foo}")
public HttpResponse<FooResponse> getFoo(@PathVariable Foo foo) {
    ...
}

...

@Get("/bar/{bar}")
public HttpResponse<BarResponse> getBar(@PathVariable Bar bar) {
    ...
}