我开始使用weblogic 11g版本10.3.2.0
weblogic是否支持CDI Beans?
谢谢
我需要在Servlet中修改用户会话对象(SessionScoped bean-CDI),所以我必须以某种方式获取该bean.我用以下方式注射:
@Inject
private UserSession user;
Run Code Online (Sandbox Code Playgroud)
UserSession是SessionScoped CDI bean.用户方法是从doPost或doGet servlet方法调用的.这很完美; 每次@Inject注释都会注入相应的UserSession bean,但我不明白这种行为是如何实现的.
我假设用@Inject注释的bean只注入一次(当创建对象 - 本例中的Servlet实例时),但这显然是错误的假设.
那么,这些bean什么时候注入到servlet中?按要求?当有多个UserSession对象时,这种方法如何避免冲突(一个servlet实例 - 处理它的多个线程)?
我正在使用Java EE 6,需要从".properties"文件加载配置.是否有推荐的方法(最佳实践)使用依赖注入从配置文件加载值?我在Spring中找到了这个注释,但我还没有找到Java EE的"标准"注释.
这家伙从头开发了一个解决方案:
"我找不到一个简单的例子,说明如何通过从文件中读取配置属性来配置CDI应用程序......"
但我想知道是否有更标准的方法而不是创建配置工厂......
configuration annotations dependency-injection cdi java-ee-6
我有一个简单的(webprofile)EJB 3.1应用程序,并尝试确定@ApplicationScopedCDI Bean中的当前用户,所以我使用:
Principal callerPrincipal = this.sessionContext.getCallerPrincipal()
Run Code Online (Sandbox Code Playgroud)
工作正常(所以我可以确定当前用户的名称).
但是在任何(其他)EJB中的任何异常之后,此调用不再起作用(我需要重新启动服务器)!该方法不会返回调用者主体,而是抛出此异常.
Caused by: java.lang.NullPointerException
at com.sun.ejb.containers.EJBContextImpl.getCallerPrincipal(EJBContextImpl.java:421)
at de.mytest.service.CurrentUserService.getCurrentUserId(CurrentUserService.java:102)
Run Code Online (Sandbox Code Playgroud)
有人能给我一个提示我做错了吗?
实施细节:
Server Glassfish 3.1.2
CurrentUserService:
@ApplicationScoped
public class CurrentUserService {
@Resource
private SessionContext sessionContext;
public long getCurrentUserId() {
if (this.sessionContext == null) {
throw new RuntimeException("initialization error, sessionContext must not be null!");
}
/*line 102 */ Principal callerPrincipal = this.sessionContext.getCallerPrincipal();
if (callerPrincipal == null) {
throw new RuntimeException("callerPrincipal must not be null, but it is");
}
String name = callerPrincipal.getName();
if …Run Code Online (Sandbox Code Playgroud) 我将Tomcat 7和CDI一起使用,为此,我使用了Knappsack Maven Archetypes中的jee6-servlet-minimal-archetype 作为起点.
现在我想使用Arquillian来测试CDI bean,但即使在搜索了很长时间之后,我也只发现了一些与该主题相关的问题.
有人能指出我pom.xml在Tomcat 7上使用Arquillian进行CDI测试的工作设置(特别是使用权)吗?
编辑2012/09/11: 正如下面的评论所指出的,我认为要解决我的问题,我需要有人帮助我理解整个设置,而不是试图在某个时候解决特定的异常.
那么,pom.xml和测试类是如何看待的,因为在tomcat 7中有一个CDI bean并且能够在嵌入式和托管容器中使用所有注入机制来测试它?(顺便说一下,为什么没有tomcat 7的远程容器适配器,因为它已经用于6?)
我已经尝试调整tomcat 6示例,但无法使其在tomcat 7上运行.
我尝试使用Jersey 2.1,并CDI在我的Java EE 7项目,该项目被部署在Glassfish 4.0.
Jersey模块依赖于Guava库.但是使用带有CDI的Guava库(14.0.1)会导致抛出以下异常.
CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [Set<Service>] with qualifiers [@Default] at injection point [[BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject com.google.common.util.concurrent.ServiceManager(Set<Service>)].
Run Code Online (Sandbox Code Playgroud)
我怎样才能克服这个问题?
我想使用weld-se进行单元测试CDI.但是,我坚持这个Weld无法解决bean的问题.我创建了一个小型项目来演示用于构建的gradle问题.
我在文件<project-root>夹中有以下文件:
./build.gradle
./src/main/java/cdi/Book.java
./src/main/resources/META-INF/beans.xml
./src/test/java/cdi/BookTest.java
./src/test/resources/META-INF/beans.xml
Run Code Online (Sandbox Code Playgroud)
下面列出了每个文件的内容.
的build.gradle
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile 'org.jboss.weld.se:weld-se:2.0.4.Final'
testCompile 'junit:junit:4.11'
}
Run Code Online (Sandbox Code Playgroud)
Book.java
package cdi;
public class Book {
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
Run Code Online (Sandbox Code Playgroud)
BookTest.java
package cdi;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class BookTest {
private static Weld weld;
private static WeldContainer weldContainer; …Run Code Online (Sandbox Code Playgroud) 我有以下界面
public interface IMyMapper<T> {}
Run Code Online (Sandbox Code Playgroud)
和实施
public class MyMapper implements IMyMapper<MyClazz> {}
Run Code Online (Sandbox Code Playgroud)
现在我想将类MyMapper注入无状态bean:
@Stateless
public class MyService {
@Inject
MyMapper mapper; //<-- does not work
@Inject
IMyMapper<MyClazz> mapper; //<-- also does not work
}
Run Code Online (Sandbox Code Playgroud)
我的问题是注射不起作用.我得到一个例外:
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type MyMapper with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject mypackage.MyService.mapper
at mypackage.MyService.mapper(MyService.java:0)
at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:370)
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:291)
at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:134)
at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:165)
at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:529)
at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:515)
at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:490)
at org.jboss.weld.bootstrap.WeldStartup.validateBeans(WeldStartup.java:419)
at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:90)
at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:225)
at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:131)
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:328)
at …Run Code Online (Sandbox Code Playgroud) 我试图在dropwizard应用程序中使用Weld-SE进行依赖注入.我可以引导Weld并在Application类中注入,如下所示:
public class App extends Application<AppConfig> {
@Inject NameService service;
@Inject RestResource resource;
public static void main(String[] args) throws Exception {
Weld weld = new Weld();
WeldContainer container = weld.initialize();
App app = container.instance().select(App.class).get();
app.run(args);
weld.shutdown();
}
}
Run Code Online (Sandbox Code Playgroud)
我已经在RestResource的一个单独的类中编写了一个生成器方法,这也是很好的注入.但是在资源类中,不会注入服务:
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public class RestResource {
@Inject NameService service;
@GET
public String test() {
return service.getName();
}
}
Run Code Online (Sandbox Code Playgroud)
此服务始终为空.有谁知道如何使这项工作?
以下代码段足以重现我的问题:
thrown属性public并获取错误org.jboss.weld.exceptions.DefinitionException: WELD-000075: Normal scoped managed bean implementation class has a public fieldpublic修饰符并获取错误org.junit.internal.runners.rules.ValidationError: The @Rule 'thrown' must be public.public修饰符到位并@Dependent在类上添加注释范围,但是出现了错误org.jboss.weld.exceptions.DefinitionException: WELD-000046: At most one scope may be specified on [EnhancedAnnotatedTypeImpl] public @Dependent @ApplicationScoped @RunWith我删除了所有不必要的代码,但这是一个非常复杂的单元测试,通过CDI进行模拟,服务注入,并且一些测试方法预计会引发异常.
import org.jglue.cdiunit.CdiRunner;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
@RunWith(CdiRunner.class)
public class FooBarTest {
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test
public void test() {
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,一方面Weld希望所有字段都不公开,因为否则它将无法代理该类,另一方面,JUnit希望规则字段是公共的,因为它使用反射来访问它们setAccessible(true)由于安全管理器处于活动状态,因此不希望使用该方法.如何处理这个悖论? …
cdi ×10
java-ee ×5
java ×4
glassfish ×2
weld ×2
annotations ×1
cdi-unit ×1
dropwizard ×1
ejb ×1
guava ×1
java-ee-6 ×1
java-ee-7 ×1
jboss-weld ×1
jersey ×1
jsf-2 ×1
junit ×1
junit-rule ×1
maven-3 ×1
servlets ×1
tomcat7 ×1
weblogic11g ×1