在被叫方法中访问iriInfo

时间:2015-03-09 20:53:09

标签: java jax-rs uri

此代码可用于访问uriInfo:

@Path("/testing")
public class Testing {
    @javax.ws.rs.core.Context UriInfo uriInfo;  

@POST
@Path("/test2")
@Produces(MediaType.TEXT_PLAIN)
public Response test2(
  @FormParam("sessionId") String sessionId ) {

  String currentUserId = Utils.setup(sessionId); 

  String accessPath = uriInfo.getAbsolutePath().toASCIIString();
  System.out.println("The client used this URI to reach this resource method: " + uriInfo.getAbsolutePath().toASCIIString());

//  Utils.test3("print this"); 
    return Response.ok("Test 2 ended").build();

        }       

当我尝试在被调用方法Utils.test3中访问uriInfo时(“打印此”);在这里:

public class Utils { 
 @javax.ws.rs.core.Context static UriInfo uriInfo;  

public static String setup(String sessionId) {

  if (!com.retailapppartners.Utils.validSession(sessionId)) {
      throw new WebApplicationException(Response.Status.UNAUTHORIZED);
  }

  String currentUserId = com.retailapppartners.Utils.getUserFromSession(sessionId);
  MDC.put("user-id", currentUserId);

  return currentUserId;
  }

public static void test3(String message) {

    System.out.println(message);
    String path = uriInfo.getPath(); 
//      System.out.println("The client used this URI: " + uriInfo.getAbsolutePath().toASCIIString());

    return; 

}

此操作因空指针异常而失败。我想在被调用的方法中看到路径uri,以确认我的utils中所有方法的安全性,称为方法。我已经搜索过hi和low这个被调用的例子。感谢

2 个答案:

答案 0 :(得分:1)

使用@Context批注将UriInfo的实例注入资源类的字段变量或方法参数

e.g。 #1

public String find(@Context UriInfo uri){}

e.g。 #2

public class RESTResource{
   @Context
   private UriInfo uri;
}

答案 1 :(得分:0)

继续我的评论..回答

  

就像我说的那样,你不能只决定将它注入你想要的任何地方。注入的类需要由JAX-RS运行时管理,因为它是将要执行注入的类。管理资源类,管理过滤器提供程序,这就是您可以注入它们的原因。你的实用工具不是。无论如何,我认为它甚至不适用于[静态]“实用程序”类(即使你以某种方式让它被管理),因为它具有静态特性。

首先我要提一下,UriInfo特定于每个请求。 static,本质上是“全球性的”。您不能将其作为静态字段注入。

我能看到的一个解决方案是使Utils类(和方法)非静态,并使用底层注入框架注入Utils类的实例,无论何时需要它。这样,如果管理Utils类,那么它应该能够注入托管的UriInfo实例。如何实现(获得Utils类)将取决于您正在使用的实现,以及它的底层注入框架。

例如,对于Jersey(2),我可以这样做

public class Utils {  
    @Context UriInfo uriInfo;

    public String test(String s) {
        return s + "=" +uriInfo.getAbsolutePath().toString();
    }
}

@Path("some")
public class SomeResource {  
    @Inject
    Utils utils;

    @GET
    public Response getSomething() {
        return Response.ok(utils.test("Hello")).build();
    }
}

public class JerseyApplication extends ResourceConfig {

    public JerseyApplication() {
        packages("stackoverflow.jersey.test");
        register(new AbstractBinder(){
            @Override
            protected void configure() {
                bind(Utils.class).to(Utils.class);
            }   
        });
    }
}

这很好用

  

C:\>curl -v http://localhost:8080/some
  结果: Hello=http://localhost:8080/some

泽西使用HK2进行注射,因此我可以利用它来注射我的Utils类。

现在这可能不是您正在寻找的答案(因为它违背了静态实用程序类的目的),但您正在尝试的也是无法完成的。无论你走到哪里,无论是重构将UriInfo传递给你的静态方法,还是上面的解决方案,你都可能需要进行大量的重构。我很惊讶你已经使用这个功能创建了200个方法,然后确定一个有效:/