将自定义对象绑定为 Micronaut http 方法中的参数(@Get、@Post、..)
Binding custom objects as parameters in Micronaut http methods (@Get, @Post, ..)
在我的应用程序中,我有一个自定义 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
}
}
我真的很想 "teach" micronaut 如何像 HttpRequest
、HttpHeaders
和文档中 Table 1. Bindable Micronaut Interfaces 中的其他值一样对待 Auth
.
基本上我想把上面的变成:
@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());
});
}
}
但它似乎并没有像我希望的那样工作。
您需要注册一个 TypedRequestArgumentBinder
bean。
您可以查看 SessionArgumentBinder
作为如何完成此操作的示例,因为会话也只是一个请求属性。
在我的应用程序中,我有一个自定义 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
}
}
我真的很想 "teach" micronaut 如何像 HttpRequest
、HttpHeaders
和文档中 Table 1. Bindable Micronaut Interfaces 中的其他值一样对待 Auth
.
基本上我想把上面的变成:
@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());
});
}
}
但它似乎并没有像我希望的那样工作。
您需要注册一个 TypedRequestArgumentBinder
bean。
您可以查看 SessionArgumentBinder
作为如何完成此操作的示例,因为会话也只是一个请求属性。