通常你需要一个InjectableProvider https://jersey.java.net/apidocs/1.7/jersey/com/sun/jersey/spi/inject/InjectableProvider.html支持自定义注入,还有Injectable https://jersey.java.net/apidocs/1.7/jersey/com/sun/jersey/spi/inject/Injectable.html提供价值。
这是一个例子
@BasicAuth
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface BasicAuth {
}
InjectableProvider
@Provider
public class BasicAuthInjectionProvider
implements InjectableProvider<BasicAuth, Parameter> {
@Override
public ComponentScope getScope() {
return ComponentScope.PerRequest;
}
@Override
public Injectable getInjectable(ComponentContext cc, BasicAuth a, Parameter c) {
return new BasicAuthInjectable();
}
}
Injectable
public class BasicAuthInjectable extends AbstractHttpContextInjectable<User>{
@Override
public User getValue(HttpContext hc) {
String authHeaderValue = hc.getRequest()
.getHeaderValue(HttpHeaders.AUTHORIZATION);
String[] credentials = ImosUtils.getUserCredentials(authHeaderValue);
return new User(credentials[0], credentials[1]);
}
}
你会注意到的一件事是我有一个User
班级。这是为了包裹username
and password
,并且只有一个注入点。 IE。
public Response getSomething(@BasicAuth User user) {
}
我实际上尝试按照你的方式做,
public Response getSomething(@BasicAuth("username") String username,
@BasicAuth("password") String password) {
并且在InjectableProvider
从传递给的注释中获取注释值getInjectable
,然后将该值传递给BasicAuthInjectable
。从那里检查该值是否为"username"
or "password"
并返回相应的值。但由于某种原因,甚至没有打电话给注射提供者。您可以尝试一下它是否可以正常工作。但对我来说User
无论如何看起来更干净,并且使用两个字符串,注入提供程序被调用两次,并且您需要解析标头两次。看来没有必要。