我有一个@ConversationScoped bean,带有一个start方法,如下所示:
@PostConstruct
public void start() {
if (conversation.isTransient()) {
conversation.begin();
log.debug("conversation.getId(): " + conversation.getId());
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,每次刷新页面时都会启动一个新会话,每次我对bean中的方法进行AJAX调用时,也会启动一个新的会话(这是我的主要问题).
我真正想要发生的是让sam对话流连,直到我手动调用conversation.end().我在这里错过了什么?
在项目中,我使用Seam 3,我注射有问题EntityManager与@Inject注解.我很确定有某种配置可以确保EnityManager知道PersistenceUnit要使用哪种配置.例如,EJB你可以输入:
@PersistenceContext(unitName="MY_PERSISTENCE_UNIT_NAME")
private EntityManager eManager;
Run Code Online (Sandbox Code Playgroud)
在persistence.xml文件中配置了哪个持久性单元.这是我的伪配置:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="MY_PERSISTENCE_UNIT_NAME" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/TimeReportDS</jta-data-source>
<mapping-file>META-INF/orm.xml</mapping-file>
<class>....</class>
<class>....</class>
<class>....</class>
<properties>
<property name="jboss.entity.manager.factory.jndi.name"
value="java:/modelEntityManagerFactory" />
<!-- PostgreSQL Configuration File -->
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
<property name="hibernate.connection.password" value="password" />
<property name="hibernate.connection.url" value="jdbc:postgresql://192.168.2.125:5432/t_report" />
<property name="hibernate.connection.username" value="username" />
<!-- Specifying DB Driver, providing hibernate cfg lookup
and providing transaction manager configuration -->
<property …Run Code Online (Sandbox Code Playgroud) 我对于同一主题提出了另一个问题仍犹豫不决,但至少现在我正在阅读正确的文档.
所以,这堂课:
class FacesContextProducer {
@Produces @RequestScoped FacesContext getFacesContext() {
return FacesContext.getCurrentInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
事实上,从焊接文档中,此方法适用于Glassfish: GlassFish使用WELD作为JSR-299的参考实现:Java上下文的Java上下文和依赖注入(CDI).
对于上面的课程,它会在哪里使用?为什么你需要一个单独的类@Produces一个FacesContext?
我已经看到了对values()内部@Qualifier定义的各种引用.我理解@Qualifier为标记系统,但您将它们定义为接口.
一个界面可以允许枚举,但我不明白values()我在下面列出的两个不相关的例子中看到的这个词.
你可以向我解释一下value()这个词是什么意思吗?
@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD})
public @interface NumberOfDigits {
Digits value();
}
public enum Digits {
TWO,
EIGHT,
TEN,
THIRTEEN
}
Run Code Online (Sandbox Code Playgroud)
package com.byteslounge.bean;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD})
public @interface MessageTransport {
MessageTransportType value();
}
Run Code Online (Sandbox Code Playgroud) 是否有可能捕获Java CDI中的生产者方法抛出的异常?我有以下生产方法
@Produces
public User getLoggedInUser() throws UserNotLoggedInException {
if(...){
throw new UserNotLoggedInException();
}
User user = ...
...
return user;
}
Run Code Online (Sandbox Code Playgroud)
我想在某处注入用户对象.我不能写这样的方法:
private void doSomethingWithUser(){
try {
User loggedInUser = user.get(); // throws exception
} catch (UserNotLoggedInException e){ // Compiler compains
...
}
}
Run Code Online (Sandbox Code Playgroud)
正如编译器所说的那样,UserNotLoggedInException不会抛出任何方法.如果我抓到一个通用Exception,一切正常.这个问题有更优雅的解决方案吗?
谢谢
需要将JSF项目转换为CDI bean项目.有几个问题需要解决.
我有一个基于泛型的特定事件处理的想法,但似乎Weld无法处理它们.我问谷歌但是找不到替代的CDI扩展.
问题:是否有CDI扩展,可以处理泛型类型事件的事件传播?
在下面我有明确的问题.
我有三个常规事件,EntityCreated,EntityChanged和EntityDeleted.它们的基类定义如下:
public abstract class DatabaseEvent<TargetType> {
public TargetType target;
public DatabaseEvent(TargetType target) {
this.target = target;
}
}
Run Code Online (Sandbox Code Playgroud)
然后事件是简单的继承类:
public class EntityCreatedEvent<TargetType> extends DatabaseEvent<TargetType> {
public EntityCreatedEvent(TargetType target) {
super(target);
}
}
Run Code Online (Sandbox Code Playgroud)
我像这样解雇他们:
public abstract class MyHome<EntityType> {
private EntityType entity;
@Inject
Event<EntityCreatedEvent<EntityType>> entityCreatedEvent;
public void fireCreatedEvent() {
EntityCreatedEvent<EntityType> payload = new EntityCreatedEvent<EntityType>(entity);
entityCreatedEvent.fire(payload);
}
}
Run Code Online (Sandbox Code Playgroud)
我想像这样观察它们:
public void handleProjectCreated(@Observes EntityCreatedEvent<Project> event) { ... }
Run Code Online (Sandbox Code Playgroud)
启动服务器时,Weld告诉我它无法处理泛型类型的事件.CDI的做法是使用额外的限定符而不是泛型来消除它们,例如:
public void handleProjectCreated(@Observes @ProjectEvent EntityCreatedEvent event) { ... }
Run Code Online (Sandbox Code Playgroud)
但是,我从该 …
我想注入默认的Java记录器.然而,Eclipse强调它并指出"没有bean有资格注入注射点[JSR-299§5.2.1]"
如果我仍然部署,则抛出以下异常.为什么它无法注入Java Logger?对于EntityManager也是如此,但对于我自己的UserRepository Bean则不行.
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [Logger] with qualifiers [@Default] at injection point [[field]
Run Code Online (Sandbox Code Playgroud)
码:
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import com.terry.webapp.data.UserRepository;
import com.terry.webapp.model.usermgmt.User;
// The @Stateless annotation eliminates the need for manual transaction demarcation
@Stateless
public class LoginService {
@Inject
private Logger log;
@Inject
private EntityManager em;
@Inject
private UserRepository repository;
public User login(User user) {
log.info("login " + user.getUsername());
User rUser = repository.findByCredentials(user.getUsername(), user.getPassword());
return rUser;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用RESTEasy和Weld进行注入的REST Web服务.当包在wildfly上部署时,我没有问题,但在尝试测试服务时,我得到以下错误.
我不知道如何解决这个问题.
有人能帮帮我吗?
21:54:17,066 ERROR [io.undertow.request] (default task-19) UT005023: Exception handling request to /cdi-test/hello: org.jboss.resteasy.spi.UnhandledException: org.jboss.weld.exceptions.IllegalArgumentException: WELD-001456: Argument resolvedBean must not be null
at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:76) [resteasy-jaxrs-3.0.8.Final.jar:]
at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:212) [resteasy-jaxrs-3.0.8.Final.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:149) [resteasy-jaxrs-3.0.8.Final.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:372) [resteasy-jaxrs-3.0.8.Final.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179) [resteasy-jaxrs-3.0.8.Final.jar:]
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220) [resteasy-jaxrs-3.0.8.Final.jar:]
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) [resteasy-jaxrs-3.0.8.Final.jar:]
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51) [resteasy-jaxrs-3.0.8.Final.jar:]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:113) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:61) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] …Run Code Online (Sandbox Code Playgroud) 我有一个Web应用程序,其中在Wildfly 9应用程序服务器上运行EJB 3.1和CDI bean。我已经阅读了有关安装和部署HA独立群集环境的Jboss文档,并且根据JBoss文档,所有EJB必须使用@Cluster注释进行注释,以便在不同的集群节点之间进行分配。我的问题是,是否也需要像对EJB一样对CDI bean进行注释?还是只需要<Distributable />在web.xml上定义标签,容器就会将所有CDI bean作为分布式对象处理?