标签: cdi

CDI SessionScoped Bean在同一会话中产生两个实例

我有两个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)

jsf cdi

5
推荐指数
1
解决办法
6795
查看次数

CDI/Weld - 结束对话后如何处理浏览器页面刷新?

在使用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问题,它工作正常.如果有人有任何建议我会很感激,希望我不会错过一些非常明显的东西.我有点假设没有摆脱重定向.

谢谢.

jsf cdi seam-conversation

5
推荐指数
1
解决办法
1353
查看次数

EJB 3.1有状态和CDI范围对话

我有一个@StatefulEJB注释为@ConversationScoped.客户端(JSF)向我的EJB发出请求:启动对话 - conversation.begin()执行某些操作并显示对客户端的响应.

然后客户端发出另一个请求,EJB执行某些操作并关闭对话 - conversation.end().

@Stateful会话结束后是否删除了EJB?或者我必须明确打电话@Remove

ejb cdi java-ee-6 ejb-3.1

5
推荐指数
1
解决办法
2135
查看次数

Java EE 6企业应用程序:注入bean时出现"不满意的依赖关系:没有bean匹配注入点"

我在Netbeans 7.2中创建了一个全新的Java EE 6企业应用程序.所以我有三个项目:

  • EJB
  • 战争

在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)

ear netbeans servlets cdi

5
推荐指数
1
解决办法
1万
查看次数

交易管理和CDI

我想用CDI开发一个应用程序(我经常使用Spring)来发现这项技术.

我已经阅读了许多关于CDI的文章,以了解它是如何工作的.我有一个关于事务管理的简单问题(例如,对于数据库中的持久性):

是否必须使用EJB 3.1进行事务管理,或者是否可以仅使用CDI进行事务管理?

谢谢.

java-ee cdi ejb-3.1

5
推荐指数
1
解决办法
8684
查看次数

在CDI SessionScoped bean中注入HttpServletRequest

我有一个会话范围的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方法?

java java-ee cdi

5
推荐指数
1
解决办法
6415
查看次数

创建@Inject对象的顺序

看下面的课程(请注意,它不是单身):

public MyClass() {

    @Inject private A a;
    @Inject private B b;

}
Run Code Online (Sandbox Code Playgroud)

什么对象将被创建第一ab

是否有可能确定创建对象的顺序?

java inject cdi

5
推荐指数
1
解决办法
379
查看次数

@Inject无法初始化对象

我正在使用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.以下是堆栈跟踪: …

java-ee cdi tomee tomee-7

5
推荐指数
0
解决办法
854
查看次数

如何将CDI用于JAX-RS客户端

我已经在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的嵌入式码头上跑步.

jax-rs jersey embedded-jetty cdi weld

5
推荐指数
1
解决办法
784
查看次数

CDI不适用于简单的适配器

我已将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

5
推荐指数
1
解决办法
279
查看次数