如果您想要的是将值直接从头部传递给您不需要创建自定义注释的方法。假设你有一个头授权,那么你可以很容易地通过声明你的方法来访问它:
@GET
public String authFromHeader(@HeaderParam("Authorization") String authorization) {
return "Header Value: " + authorization + "\n";
}
你可以通过调用卷曲来测试它。
$ curl --header "Authorization: 1234" http://localhost:8080/rest/resource
Header Value: 1234
鉴于您的问题的答案,如何创建自定义绑定如下。
首先你必须这样声明你的注释:
@java.lang.annotation.Target(PARAMETER)
@java.lang.annotation.Retention(RUNTIME)
@java.lang.annotation.Documented
public @interface UserAuthHeaderParam {
}
注释声明你必须定义如何解决它。声明价值出厂提供商(这是您可以访问标题参数的地方 – 请参阅我的评论):
@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() {
@Override
protected String get(HttpContext httpContext) {
// you can get the header value here
return "testString";
}
};
}
}
现在声明一个注射解析器
public class UserAuthHeaderParamResolver extends ParamInjectionResolver {
public UserAuthHeaderParamResolver() {
super(UserAuthHeaderParamValueFactoryProvider.class);
}
}
和一个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>() {})
.in(Singleton.class);
}
}
现在最后一件事,在您的ResourceConfig中添加注册表(新的HeaderParamResolverBinder()),就像这样
@ApplicationPath("rest")
public class MyApplication extends ResourceConfig {
public MyApplication() {
register(new HeaderParamResolverBinder());
packages("your.packages");
}
}
鉴于此,您应该可以根据需要使用该值:
@GET
public String getResult(@UserAuthHeaderParam String param) {
return "RESULT: " + param;
}
我希望这有帮助。