我有两个SessionScoped CDI bean实例用于同一个会话.我的印象是CDI会为我生成一个实例,但它产生了两个.我误解了CDI是如何工作的,还是我发现了一个错误?
这是bean代码:
package org.mycompany.myproject.session;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.http.HttpSession;
@Named @SessionScoped public class MyBean implements Serializable {
private String myField = null;
public MyBean() {
System.out.println("MyBean constructor called");
FacesContext fc = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession)fc.getExternalContext().getSession(false);
String sessionId = session.getId();
System.out.println("Session ID: " + sessionId);
}
public String getMyField() {
return myField;
}
public void setMyField(String myField) {
this.myField = myField;
}
}
Run Code Online (Sandbox Code Playgroud)
这是Facelet代码:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML …Run Code Online (Sandbox Code Playgroud) 在使用CDI的最初阶段,我使用faces-redirect = true导航到一个长时间运行的对话活动的页面,所以我有一个像..myPage.xhtml?cid = 1的URL.
在某些时候,我结束了对话,我的意思是,这必须是一个合理的事情,或者你可以使用会话范围?无论如何,我结束了对话,然后用户点击了F5,当然这会导致'找不到对话'错误,因为cid = 1不存在.
任何人都可以建议如何解决这个问题?我正在使用Steven Verborgh ViewScoped实现,只是使用会话范围的bean在页面之间传递参数.所以我有两个@ViewScoped bean,每个bean都返回第1页和第2页.我@Injected @ConversationScoped ParameterBean到两个视图范围的bean中.我在从第1页调用的action方法中启动对话(parameterBean.getConversation().begin()).在第2页的preRenderView事件中,我将parameterBean的属性引用到第2页支持bean实例变量和结束谈话,它完成了它的工作而不再需要.
除了F5问题,它工作正常.如果有人有任何建议我会很感激,希望我不会错过一些非常明显的东西.我有点假设没有摆脱重定向.
谢谢.
我有一个@StatefulEJB注释为@ConversationScoped.客户端(JSF)向我的EJB发出请求:启动对话 - conversation.begin()执行某些操作并显示对客户端的响应.
然后客户端发出另一个请求,EJB执行某些操作并关闭对话 - conversation.end().
@Stateful会话结束后是否删除了EJB?或者我必须明确打电话@Remove?
我在Netbeans 7.2中创建了一个全新的Java EE 6企业应用程序.所以我有三个项目:
在EJB-Project中,我创建了一个简单的Bean:
package de.aidaorga.test;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
@Stateless
@LocalBean
public class NewSessionBean2343 {
}
Run Code Online (Sandbox Code Playgroud)
在WAR-Project中,我在"Web Pages\WEB-INF"文件夹中创建了一个空白beans.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>
Run Code Online (Sandbox Code Playgroud)
我还创建了一个简单的Servlet:
import de.aidaorga.test.NewSessionBean2343;
import java.io.IOException;
import javax.ejb.EJB;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name = "NewServlet2343", urlPatterns = {"/NewServlet2343"})
public class NewServlet2343 extends HttpServlet {
@Inject
NewSessionBean2343 newSessionBean2343_1;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
@Override
protected void …Run Code Online (Sandbox Code Playgroud) 我想用CDI开发一个应用程序(我经常使用Spring)来发现这项技术.
我已经阅读了许多关于CDI的文章,以了解它是如何工作的.我有一个关于事务管理的简单问题(例如,对于数据库中的持久性):
是否必须使用EJB 3.1进行事务管理,或者是否可以仅使用CDI进行事务管理?
谢谢.
我有一个会话范围的CDI bean,我需要以某种方式访问HttpServletRequest这个bean的@PostConstruct方法中的对象.可能吗?我试图注入这样一个对象,但结果是:
WELD-001408 Unsatisfied dependencies for type [HttpServletRequest] with qualifiers [@Default] at injection point [[field] @Inject ...]
Run Code Online (Sandbox Code Playgroud)
正如我在google搜索中所理解的那样,Seam框架具有这样的功能,但我在GlassFish服务器上有一个标准的Java EE应用程序.
是否有可能以某种方式将请求传递给CDI bean的@PostConstruct方法?
看下面的课程(请注意,它不是单身):
public MyClass() {
@Inject private A a;
@Inject private B b;
}
Run Code Online (Sandbox Code Playgroud)
什么对象将被创建第一a或b?
是否有可能确定创建对象的顺序?
我正在使用tomee服务器来运行我的javaEE应用程序.我写了一个注入对象的过滤器.但是,该对象似乎没有实例化:
以下是我的代码:
Filter.java
@Priority(value = 2)
@Provider
@Singleton
public class Filter implements ContainerRequestFilter {
@Inject
private Faculty faculty;
public void filter(ContainerRequestContext requestContext) {
System.out.println("faculty name is :"+faculty.getFacultyName());
}
}
Run Code Online (Sandbox Code Playgroud)
Faculty.java
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
public class Faculty {
private List<String> facultyMembers;
private String facultyName;
@PostConstruct
public void initialize() {
this.facultyMembers = new ArrayList<String>();
facultyMembers.add("Ian Schultz");
facultyMembers.add("Diane Reyes");
facultyName = "Computer Science";
}
public List<String> getFacultyMembers() {
return facultyMembers;
}
public String getFacultyName() {
return facultyName;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在获得NPE.以下是堆栈跟踪: …
我已经在SO和官方文档上搜索了一段时间,但我找不到直接使用CDI注入到JAX-RS客户端的方法.
我使用构建器方法检索客户端,我想注册一个WriterInterceptor(或任何类似组件的过滤器),它使用注入来检索另一个bean.
我想使用CDI注入并避免使用HK2注册每个bean.
ClientBuilder.newBuilder()
.register(MyWriter.class)
.build();
Run Code Online (Sandbox Code Playgroud)
和MyWriter一起注入类.
@Provider
public class MyWriter implements WriterInterceptor {
private final MyRepo repo;
@Inject
public MyWriter(MyRepo repo) {
this.repo = repo;
}
@Override
public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
context.proceed();
}
}
public class MyRepo {
}
Run Code Online (Sandbox Code Playgroud)
我在泽西2和Weld SE的嵌入式码头上跑步.
我已将CDI功能添加到server.xml文件中<feature>cdi-1.2</feature>.
我的行家模块包含的beans.xml里面<module_name>/src/main/resources/META-INF的文件夹.
这是beans.xml内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
version="1.1" bean-discovery-mode="all">
</beans>
Run Code Online (Sandbox Code Playgroud)
但是当我使用@Inject注释它不起作用时,我的bean总是如此null.
码:
package ch.webapp.presentation;
...
@Path("/test/")
public class MyController {
@Inject
private MyService myService;
@GET
@Path("/foo/{count}")
@OAuthSecurity(scope = "login")
@Produces("application/json")
public Response news(@PathParam("count") int count) {
return Response
.ok(myService.getBar(count))
.build();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
那是我的豆子
package ch.webapp.service;
...
@RequestScoped
public class MyService {
public String getBar(int count) {
return "foo";
}
}
Run Code Online (Sandbox Code Playgroud)
我通过扩展MFPJAXRSApplication类来初始化jax-rs …
cdi websphere-liberty ibm-mobilefirst mobilefirst-adapters open-liberty