【发布时间】:2018-07-13 02:52:26
【问题描述】:
我希望在 Java EE 中的请求的整个生命周期中都有一个变量。 例如,它可能是一个日志功能,这样我就可以按请求过滤所有日志条目。
我想要了解的关键部分是,它必须相对容易在现有应用程序中实现,因此如果可能的话,可以使用某种依赖注入来获取与特定请求相关的变量。
我已经尝试注入@RequestScoped 变量,但它不起作用,因为它仅作用于容器。我需要能够将相同的对象注入不同的容器。这是可能吗?
编辑:我想要类似这样的东西:
@RequestScoped
public class RequestVariables {
public String id;
}
@Stateless
public class Logger {
@Inject
private RequestVariables requestVariables;
public void log(String message) {
System.out.println(requestVariables.id + ":" + message);
}
}
@Stateless
public class Service {
@Inject
private Logger logger;
@Inject
private RequestVariables requestVariables;
public void save(String data) {
logger.log("Save");
session.save(data + requestVariables.id); //Maybe add request parameter to save aswell
}
}
public class API {
@Inject
private Service service;
@Inject
private Logger logger;
@Inject
private RequestVariables requestVariables;
@Path("/1")
@GET
public Response get(@QueryParam("data") String data) {
requestVariables.id = UUID.randomUUID().toString()
service.save(data);
logger.log("Get");
return Response.status(204).build();
}
}
目前这是我尝试过的:
@RequestScoped
public class RequestScope {
private int test = 0;
public RequestScope(int test) {
this.test = test;
}
public RequestScope(){}
public int getTest() {
return test;
}
public void setTest(int test) {
this.test = test;
}
}
@Provider
public class RequestScopeFilter implements ContainerRequestFilter {
@Inject
private javax.inject.Provider<RequestScope> requestScopeProvider;
@Context
private HttpServletRequest request;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
requestScopeProvider.get().setTest(42);
request.setAttribute("test", "superTest");
}
}
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
@TransactionAttribute(value=TransactionAttributeType.NOT_SUPPORTED)
public class Service {
@Context
private HttpServletRequest httpServletRequest;
@Inject
private Provider<RequestScope> requestScopeProvider;
public void test() {
RequestScope scope = requestScopeProvider.get();
String test = (String)httpServletRequest.getAttribute("test");
}
}
所以当我从我的服务中获取范围时,它是一个新对象,test 设置为 0,然后它抛出一个 NPE,因为 httpServletRequest 为空
【问题讨论】:
-
制作Object Singleton,在Spring中有@Scope("Singleton")注解在class级别,你也可以通过xml级别定义。
-
@ArifMustafa 但如果我将其设为单例,它的状态不会在不同请求之间共享吗?
-
docs.oracle.com/javaee/6/tutorial/doc/gipvi.html 阅读有关 Singletons 的信息,看起来好像状态将在请求之间共享(也许不是在会话之间?)
-
请附上出处,我们会进一步了解您的情况...
-
我同意 ArifMustafa,我们需要更好的描述。对于日志记录,单例将是理想的。你将不得不解释更多你真正想要做的事情。试着给我们一些代码和至少两到三个用例示例。
标签: java jakarta-ee dependency-injection scope