标签: cdi

使用CDI代替@ManagedBean:UnproxyableResolutionException,因为超类没有no-args构造函数

我正在尝试将CDI用于我的JSF/Java EE应用程序.我有以下类层次结构:

/**
 * base controller class
 * also contains some final methods and an inner enum class declaration
 */
public abstract class AbstractCrudController<K, E> implements Serializable {
  private Class<E> entityClass;

  public AbstractCrudController(Class<E> entityClass) {
    this.entityClass = entityClass;
  }

  // ...
}


import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

@Named
@SessionScoped
public class CategoryController extends AbstractCrudController<Long, Category> implements Serializable {
  public CategoryController() {
    super(Category.class);
  }
  //...
}
Run Code Online (Sandbox Code Playgroud)

当我尝试在GF 3.1上部署应用程序时,我得到以下CDI/Weld异常:

严重:加载应用程序时出现异常:WELD-001435正常范围的bean类com.web.AbstractCrudController不可代理,因为它没有no-args构造函数.org.jboss.weld.exceptions.UnproxyableResolutionException:WELD-001435正常范围的bean类com.web.AbstractCrudController不可代理,因为它没有no-args构造函数.在org.jboss.weld.util.Proxies.getUnproxyableClassException(Proxies.java:215)在org.jboss.weld.util.Proxies.getUnproxyableTypeException(Proxies.java:166)在org.jboss.weld.util.Proxies.getUnproxyableTypesException (Proxies.java:191)位于org.jboss的org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:134)org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:148). weld.bootstrap.Validator.

即使我向基类添加了一个no-args构造函数,Weld仍然会抱怨该类不可代理,因为它有最终方法.为什么WELD强迫我改变我的班级设计?使用JSF @ManagedBean批注一切正常.

我将不胜感激任何帮助.谢谢,西奥

cdi jsf-2 jboss-weld

8
推荐指数
1
解决办法
8137
查看次数

如何从Filter中获取SessionScoped CDI bean?

这个问题与前一个关于编写会话超时处理程序的问题有关.

该线程的答案涉及从servlet访问各种会话范围的托管bean.建议(如看到这里)是这样做的过滤器:

HttpSession session = request.getSession(false);
User user = (session != null) ? (User) session.getAttribute("user") : null;
Run Code Online (Sandbox Code Playgroud)

据推测,这会获取User类的会话bean .问题是这不起作用.

出了什么问题,bean在会话属性中存在,但它们由Weld工具包装.我写了doFilter()方法如下:

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    String sp = req.getServletPath();
    System.out.println("------------------------");
    System.out.println("doFilter(): " + sp);

    if (!sp.startsWith("/javax")) {  // eliminates many requests
        HttpSession session = req.getSession();
        Enumeration<String> en = session.getAttributeNames();
        int count = 0;            
        while (en.hasMoreElements()) …
Run Code Online (Sandbox Code Playgroud)

cdi jsf-2 servlet-filters

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

如何实现容器管理事务(CMT)?

我想将一个object(ReportBean)持久化到数据库,但是我收到了错误消息:

javax.persistence.TransactionRequiredException: Transaction is required to perform this operation (either use a transaction or extended persistence context)  
Run Code Online (Sandbox Code Playgroud)

这是一些代码:

实体

@Entity
@Table(name="t_report")
@Access(AccessType.FIELD)
public class ReportBean implements Serializable {

    // fields (@Column, etc.)
    // setters/getters methods
    // toString , hashCode, equals methods
}
Run Code Online (Sandbox Code Playgroud)

允许EntityManager注入的自定义注释(带@Inject)

import javax.inject.Qualifier;
import static java.lang.annotation.ElementType.*;
import java.lang.annotation.Target;

@Qualifier
@Target({TYPE, METHOD, FIELD, PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyEm {
}
Run Code Online (Sandbox Code Playgroud)

EntityManager提供程序

import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;

public class EntityManagerProvider { …
Run Code Online (Sandbox Code Playgroud)

transactions java-ee cdi

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

Java EE vs Standalone

我正在开发一个项目,我们需要构建几个连接到一个数据库的"独立"模块.这些模块主要是后台业务流程,因此前端不多.除了一个显示数据并允许基本CRUD功能的Web模块.为此,我们计划使用以下技术:

  • JPA2(使用hibernate-jpa实现)
  • CDI(使用spring实现)
  • JSF2 + primefaces(用于我们的web模块)

最初的计划是每个模块创建一个jar文件(使用main方法),并通过服务包装器将其安装为(windows)服务.对于我们的Web模块,我们将使用Glassfish或JBoss来运行它.然而,最近Java EE出现在我们的脑海中.我们可以在像Glassfish或JBoss这样的Java EE容器中运行我们所有的模块,而不仅仅是我们的web模块.关于Java EE的案例的一些问题:

  1. 可以/我们还应该使用带弹簧的CDI吗?或者我们应该切换到EJB3?
  2. 当我们在容器内而不是独立模块中使用JPA时,会对JPA产生什么影响?有什么区别吗?
  3. 由于我们的大多数模块都不与Web相关,因此在Java EE容器中运行它们仍然有意义吗?

spring hibernate jpa java-ee cdi

8
推荐指数
1
解决办法
1797
查看次数

哪个CDI范围应该用于DAO和服务类

我正在尝试使用JPA,CDI(OpenWebBeans + Deltaspike JPA模块),JSF构建应用程序.我使用部署在Tomcat上的CDI的方式与我习惯使用Spring框架的方式相同.我有这样的DAO叫GenericDAOImpl(前几行):

public abstract class GenericDaoJpa<T> implements GenericDao<T> {
    private static final Log logger = LogFactory.getLog(GenericDaoJpa.class);

    @Inject
    protected EntityManager entityManager;

    private Class<T> type;
Run Code Online (Sandbox Code Playgroud)

使用DeltaSpike JPA modulehttp://deltaspike.apache.org/jpa.html注入EntityManager.这个GenericDao然后由服务类使用的具体DAO(UserDao等...)继承.

例如UserServiceImpl:

public class UserServiceImpl implements UserService {

    private static final Log logger = LogFactory.getLog(UserServiceImpl.class);

    @Inject
    private UserDao userDao;

    @Transactional
    public void saveUser(UserDto user) throws UserServiceException {
        try {
            User u = new User(user);
            userDao.create(u);
        } catch (Exception e) {
            logger.error("Error while creating user.", e);
            throw new UserServiceException("Error while creating user.");
        }
    } …
Run Code Online (Sandbox Code Playgroud)

jpa java-ee cdi

8
推荐指数
1
解决办法
2468
查看次数

如何在beans.xml中指定@Alternative生成器方法?

说我有:

public interface Foo {...}

public class AltProducer {
  private Foo altFoo;

  @Produces @Alternative
  public Foo getAltFoo() { return altFoo; }
}
Run Code Online (Sandbox Code Playgroud)

我需要在beans.xml中放置什么才能调用我的AltProducer的@Produces方法,而不是注入Bar?

java dependency-injection java-ee cdi weld

8
推荐指数
1
解决办法
4470
查看次数

Errai经验:用户界面,通信,依赖注入

我对GWT,GIN和GWTP-dispatch有广泛的经验,因为我没有任何Errai经验,我想问你是否真的是在Errai上构建整个单页富Web应用程序作为基础的好选择.如果您对Errai有广泛的经验,那么很高兴收到您的来信.

我正在构建一个视频流媒体网络应用程序.让我们说它是另一个YouTube(布局,动作,流程等),但是类固醇(不相关).

我已经阅读了Errai的全部文档,这是我的疑虑/问题.

  1. Errai JAX-RS - 我对任何复杂的消息都不感兴趣Errai因服务器 - >客户端,客户端 - >客户端,广播,对话等而闻名.我希望通过RS进行简单的AJAX调用.显而易见的是通信性能,没有冗余调用,只有单个HTTP请求和响应?
    这里提到的限制怎么样(如何使用Errai将GWT与JAX-RS/RESTEasy服务器集成?):这些是最新的,我必须考虑到一些Errai限制来实现REST服务吗?

  2. Errai IoC/CDI - GIN对我来说似乎更成熟,绝对更受欢迎(带来所有好处).但看起来他们可以完美地共存,或者我应该选择其中一个?让许多Errai bean(如Caller)注入一个注释是很好的.对于我的理解,我不需要CDI.如果我在我的项目中使用Errai IOC,我可以通过CDI获得哪些附加功能?我是否必须在我的类路径上使用它以便所有内容都由ioc容器实例化?
    我是否理解正确:IoC可以实现简单的布线,CDI是我可以实际配置和实例化注入的bean的地方吗?例如@Produces在CDI中,而不在IOC中.你能解释一下Errai IOC和CDI在纯DI背景下的区别吗?我知道一个人是另一个人的超集,但我仍然不太明白.

  3. Errai数据绑定:很棒,很棒的功能但它扭曲了MVP模式.Currenlty我已经在基本MVP中编写了我的应用程序(没有mvp框架,模型和视图之间没有交互).我可以从演示者管理@Model上的数据绑定,而不是从视图管理数据绑定(这将使用带有Errai UI的HTML模板)吗?

  4. Errai UI:在数据绑定和连线View类中,如何使用像CellTable这样的GWT现有小部件?
    一般来说,在使用Errai编写更复杂的小部件(例如带有寻呼机的图像库)时,您会使用什么方法?您是否利用现有的GWT小部件(如CellTable) - 单个重型小部件 - 或者更确切地说是在html模板中布局所有内容,并将某些div连接到View类中相应的数据字段 - 更轻量级的小部件?我已经看到了Errai UI的一位作者的观点:
    关于Errai UI的好处是你只是将这个模板文件转储到你的项目中然后你说"好的这块模板属于这个组件"或"这个模板的一部分属于这个其他组件".你可以将这些东西连接在一起,你的模板就会在你面前呈现 - 就在浏览器中.
    所以,假设我有一个整个图库的html布局.显然我不想用CellTable重新创建它,但是利用那个布局,所以我必须能够:创建整个图像库作为一个复合材料,它本身必须连接到布局中的最外层元素并连接每个数据-field到我的Composite类中的相应属性.那可能吗?

服务器应该是GWT/Errai不可知的:在服务器端,我想尽可能少地使用Errai(因为我不想要像我所说的任何花哨的通信功能)并使用Spring on Jetty或Tomcat维护应用程序.

通过添加新技术作为基础,即在其上构建整个应用程序,总是存在一种风险,即它不够灵活,这意味着需要一些黑客来克服不可预见的障碍,或者在某些可怕的情况下,整个技术将不得不被遗弃

最后一个简单的问题:errai的在线javadoc在哪里?

gwt jax-rs inversion-of-control cdi errai

8
推荐指数
1
解决办法
575
查看次数

CDI是否适用于常规Java应用程序?

我有三个类的简单maven项目.在我,META-INF我有空beans.xml.每次我跑我的时候Main.java我都会得到一个NullPointerException.

Exception in thread "main" java.lang.NullPointerException
at hom.World.helloWorld(World.java:12)
at hom.Main.main(Main.java:6)
Run Code Online (Sandbox Code Playgroud)

我想要完成的是否超出CDI的范围?

Hello.java

package hom;
import javax.enterprise.inject.Default;

@Default
public class Hello {
   public String hello() {
      return "Hello ";
   }
}
Run Code Online (Sandbox Code Playgroud)

World.java

package hom;
import javax.enterprise.inject.Default;
import javax.inject.Inject;

@Default
public class World {
   @Inject
   Hello hello;

   public String helloWorld() {
      return hello.hello() + "World!";
   }
}
Run Code Online (Sandbox Code Playgroud)

Main.java

package hom;
public class Main {
   public static void main(String[] args) {
      World helloWorld = new …
Run Code Online (Sandbox Code Playgroud)

java cdi

8
推荐指数
1
解决办法
2187
查看次数

警告:来自public void org.omnifaces.cdi.eager.EagerBeansRepository.setXxx的List <Bean <?>>类型的参数1无法解析为具体类型

我正在使用Omnifaces 1.8.1,每当我将我的应用程序部署到Glassfish时,我都会收到以下警告,这会导致部署过程出现延迟.

Warning:   WELD-001519 An InjectionTarget implementation is created for an abstract class org.omnifaces.eventlistener.DefaultHttpSessionListener. It will not be possible to produce instances of this type!
Warning:   WELD-001519 An InjectionTarget implementation is created for an abstract class org.omnifaces.eventlistener.DefaultServletContextListener. It will not be possible to produce instances of this type!
Warning:   WELD-001519 An InjectionTarget implementation is created for an abstract class org.omnifaces.eventlistener.DefaultServletRequestListener. It will not be possible to produce instances of this type!
Warning:   WELD-001519 An InjectionTarget implementation is created for an …
Run Code Online (Sandbox Code Playgroud)

jsf glassfish cdi omnifaces weld

8
推荐指数
1
解决办法
2872
查看次数

需要事务才能执行此操作(使用事务或扩展持久性上下文)

我正在使用Wildfly 10.0.0 Final,Java EE7,Maven和JPA 2.1.当我查询我的数据库中的记录时,它工作正常并列出了员工,但是当我试图坚持一个新员工时,它给了我以下异常:

javax.servlet.ServletException: WFLYJPA0060: Transaction is required to perform this operation (either use a transaction or extended persistence context)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:671)
io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
...
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用JSF和CDI bean来实现它.我有一个JTA数据源,我在persistence.xml文件中配置了它:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
    <persistence-unit name="MyPersistenceUnit">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>java:/EmployeesDS</jta-data-source>
        <class>com.home.entity.Employee</class>
        <properties>
            <property name="hibernate.archive.autodetection" value="class"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hbm2ddl.auto" value="update"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        </properties>
    </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)

CDI bean可以在下面看到.它相对简单,有一种方法可以列出25名员工,另一种方法可以保留特定员工:

@Named
@RequestScoped
public class DataFetchBean {
    @PersistenceContext
    EntityManager em;

    public List getEmployees() {
        Query query = …
Run Code Online (Sandbox Code Playgroud)

hibernate jpa java-ee cdi managed-bean

8
推荐指数
2
解决办法
2万
查看次数