yza*_*rew 16 java grizzly jersey-2.0
我正在尝试为我的restful服务创建一个自定义的http param绑定.请参阅下面的示例.
@POST
@Path("/user/{userId}/orders")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public MyResult foo(@PathParam("userId") String someString, @UserAuthHeaderParam String authString){
}
Run Code Online (Sandbox Code Playgroud)
您可以看到函数签名中有UserAuthHeaderParam注释.我想要做的是有一个自定义的http param绑定,而不是标准的javax.ws.rs.*Param.
我试图实现org.glassfish.hk2.api.InjectionResolver,它基本上从http头中提取值:
public class ProtoInjectionResolver implements InjectionResolver<UserAuthHeaderParam>{
...
@Override
public Object resolve(Injectee injectee, ServiceHandle< ? > root)
{
return "Hello World";
}
...
}
Run Code Online (Sandbox Code Playgroud)
当我调用restful服务时,服务器会遇到异常.它表明框架无法解析函数签名中的参数:
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=String,parent=MyResource,qualifiers={}),position=0,optional=false,self=false,unqualified=null,2136594195),
java.lang.IllegalArgumentException: While attempting to resolve the dependencies of rs.server.MyResource errors were found
Run Code Online (Sandbox Code Playgroud)
请帮忙.任何建议表示赞赏.我在谷歌上做了很多搜索,但未能使它工作.泽西岛2.*.如何替换Jersey 1.*的InjectableProvider和AbstractHttpContextInjectable可能是类似的问题.
- 更新:我使用AbstractBinder将我的解析器绑定到UserAuthHeaderParam:
public class MyApplication extends ResourceConfig
{
public MyApplication()
{
register(new AbstractBinder()
{
@Override
protected void configure()
{
// bindFactory(UrlStringFactory.class).to(String.class);
bind(UrlStringInjectResolver.class).to(new TypeLiteral<InjectionResolver<UrlInject>>()
{
}).in(Singleton.class);
}
});
packages("rs");
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
lpi*_*ora 13
如果您只想将值直接从标头传递给方法,则无需创建自定义注释.假设您有一个标题Authorization
,那么您可以通过声明这样的方法轻松访问它:
@GET
public String authFromHeader(@HeaderParam("Authorization") String authorization) {
return "Header Value: " + authorization + "\n";
}
Run Code Online (Sandbox Code Playgroud)
您可以通过调用来测试它curl
,例如
$ curl --header "Authorization: 1234" http://localhost:8080/rest/resource
Header Value: 1234
Run Code Online (Sandbox Code Playgroud)
鉴于您的问题的答案,如何创建自定义绑定如下.
首先,您必须声明您的注释,如下所示:
@java.lang.annotation.Target(PARAMETER)
@java.lang.annotation.Retention(RUNTIME)
@java.lang.annotation.Documented
public @interface UserAuthHeaderParam {
}
Run Code Online (Sandbox Code Playgroud)
声明注释后,您必须定义如何解析它.声明Value Factory Provider(这是您可以访问标头参数的位置 - 请参阅我的评论):
@Singleton
public class UserAuthHeaderParamValueFactoryProvider extends AbstractValueFactoryProvider {
@Inject
protected UserAuthHeaderParamValueFactoryProvider(MultivaluedParameterExtractorProvider mpep, ServiceLocator locator) {
super(mpep, locator, Parameter.Source.UNKNOWN);
}
@Override
protected Factory<?> createValueFactory(Parameter parameter) {
Class<?> classType = parameter.getRawType();
if (classType == null || (!classType.equals(String.class))) {
return null;
}
return new AbstractHttpContextValueFactory<String>() {
@Override
protected String get(HttpContext httpContext) {
// you can get the header value here
return "testString";
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
现在声明一个注射旋转变压器
public class UserAuthHeaderParamResolver extends ParamInjectionResolver<UserAuthHeaderParam> {
public UserAuthHeaderParamResolver() {
super(UserAuthHeaderParamValueFactoryProvider.class);
}
}
Run Code Online (Sandbox Code Playgroud)
和一个Binder为您的配置
public class HeaderParamResolverBinder extends AbstractBinder {
@Override
protected void configure() {
bind(UserAuthHeaderParamValueFactoryProvider.class)
.to(ValueFactoryProvider.class)
.in(Singleton.class);
bind(UserAuthHeaderParamResolver.class)
.to(new TypeLiteral<InjectionResolver<UserAuthHeaderParam>>() {})
.in(Singleton.class);
}
}
Run Code Online (Sandbox Code Playgroud)
现在最后一件事,在您的ResourceConfig添加中register(new HeaderParamResolverBinder())
,就像这样
@ApplicationPath("rest")
public class MyApplication extends ResourceConfig {
public MyApplication() {
register(new HeaderParamResolverBinder());
packages("your.packages");
}
}
Run Code Online (Sandbox Code Playgroud)
鉴于此,您现在应该可以根据需要使用该值:
@GET
public String getResult(@UserAuthHeaderParam String param) {
return "RESULT: " + param;
}
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助.
归档时间: |
|
查看次数: |
5638 次 |
最近记录: |