我正在尝试将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批注一切正常.
我将不胜感激任何帮助.谢谢,西奥
这个问题与前一个关于编写会话超时处理程序的问题有关.
该线程的答案涉及从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) 我想将一个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) 我正在开发一个项目,我们需要构建几个连接到一个数据库的"独立"模块.这些模块主要是后台业务流程,因此前端不多.除了一个显示数据并允许基本CRUD功能的Web模块.为此,我们计划使用以下技术:
最初的计划是每个模块创建一个jar文件(使用main方法),并通过服务包装器将其安装为(windows)服务.对于我们的Web模块,我们将使用Glassfish或JBoss来运行它.然而,最近Java EE出现在我们的脑海中.我们可以在像Glassfish或JBoss这样的Java EE容器中运行我们所有的模块,而不仅仅是我们的web模块.关于Java EE的案例的一些问题:
我正在尝试使用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) 说我有:
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?
我对GWT,GIN和GWTP-dispatch有广泛的经验,因为我没有任何Errai经验,我想问你是否真的是在Errai上构建整个单页富Web应用程序作为基础的好选择.如果您对Errai有广泛的经验,那么很高兴收到您的来信.
我正在构建一个视频流媒体网络应用程序.让我们说它是另一个YouTube(布局,动作,流程等),但是类固醇(不相关).
我已经阅读了Errai的全部文档,这是我的疑虑/问题.
Errai JAX-RS - 我对任何复杂的消息都不感兴趣Errai因服务器 - >客户端,客户端 - >客户端,广播,对话等而闻名.我希望通过RS进行简单的AJAX调用.显而易见的是通信性能,没有冗余调用,只有单个HTTP请求和响应?
这里提到的限制怎么样(如何使用Errai将GWT与JAX-RS/RESTEasy服务器集成?):这些是最新的,我必须考虑到一些Errai限制来实现REST服务吗?
Errai IoC/CDI - GIN对我来说似乎更成熟,绝对更受欢迎(带来所有好处).但看起来他们可以完美地共存,或者我应该选择其中一个?让许多Errai bean(如Caller)注入一个注释是很好的.对于我的理解,我不需要CDI.如果我在我的项目中使用Errai IOC,我可以通过CDI获得哪些附加功能?我是否必须在我的类路径上使用它以便所有内容都由ioc容器实例化?
我是否理解正确:IoC可以实现简单的布线,CDI是我可以实际配置和实例化注入的bean的地方吗?例如@Produces在CDI中,而不在IOC中.你能解释一下Errai IOC和CDI在纯DI背景下的区别吗?我知道一个人是另一个人的超集,但我仍然不太明白.
Errai数据绑定:很棒,很棒的功能但它扭曲了MVP模式.Currenlty我已经在基本MVP中编写了我的应用程序(没有mvp框架,模型和视图之间没有交互).我可以从演示者管理@Model上的数据绑定,而不是从视图管理数据绑定(这将使用带有Errai UI的HTML模板)吗?
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在哪里?
我有三个类的简单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) 我正在使用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) 我正在使用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)