此代码可用于访问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这个被调用的例子。感谢
答案 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个方法,然后确定一个有效:/