gpt4 book ai didi

java - 使用 Jersey 1.x 自定义注解注入(inject)

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:43:30 25 4
gpt4 key购买 nike

I am using jersey 1.9.1. I have rest method like following where Authorization header contained encoded credentials such as username and password and it is parsed in a method and mapped local values.

@PUT
@Path(SystemConstants.REST_MESSAGE_SENDSMS)
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON})
public Response sendSms(@HeaderParam("Authorization") String authorization, String param) {

String[] credentials = ImosUtils.getUserCredentials(authorization);
String username = credentials[0];
String password = credentials[1];
}

我正在尝试设计一种方法来自动执行此过程,而无需在每个方法中编写相同的解析代码。我的意思是我想知道是否为此编写一个特殊的注释,例如 HeaderParamExtended 用于解析此凭据。
我正在使用 jersey 1.9.1 版本作为 rest api。在那个生命周期中我必须在哪里编辑一个类?

@PUT
@Path(SystemConstants.REST_MESSAGE_SENDSMS)
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON})
public Response sendSms(@HeaderParamExtended("Authorization","username") String username, @HeaderParamExtended("Authorization","password") String password, , String param) {


}

最佳答案

通常你需要一个 InjectableProvider支持自定义注入(inject),还有一个Injectable提供值(value)。

举个例子

@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();
}
}

可注入(inject)

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 类。这是把usernamepassword包裹起来,只有一个注入(inject)点。即

public Response getSomething(@BasicAuth User user) {
}

我实际上试着用你的方式来做

public Response getSomething(@BasicAuth("username") String username,
@BasicAuth("password") String password) {

并在 InjectableProvider 中从传递给 getInjectable 的注解中获取注解值,然后将该值传递给 BasicAuthInjectable。从那里检查值是 "username" 还是 "password" 并返回相应的值。但出于某种原因,注入(inject)提供者甚至没有被调用。您可以尝试一下,看看是否可以正常工作。但对我来说,User 无论如何看起来更干净,并且对于这两个字符串,注入(inject)提供程序被调用两次,您需要解析 header 两次。似乎没有必要。

关于java - 使用 Jersey 1.x 自定义注解注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30500125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com