我可以(如果是这样,如何?)javax.naming.Context#lookup在EJB模块中查找CDI托管bean ?
我正在使用GlassFish v3.我想我可以使用@Named,但是什么是CDI托管bean的JNDI名称?我想从非托管POJO中查找它们,所以我无法使用@Inject.
我想做这样的事情:
@Stateless
public class GreeterEjb {
private final Greeter greeter;
@Inject
public GreeterEjb(Greeter greeter) {
this.greeter = greeter;
}
public String greet() {
return greeter.greet();
}
}
Run Code Online (Sandbox Code Playgroud)
我用Glassfish 3.1.1和JBoss 7.0.2尝试了混合结果.在某些情况下,它可以工作,在其他情况下则不然.如果您对详细信息感兴趣,请参阅Glassfisch论坛中的此主题.
在EJB 3.1规范,部分4.9.2 bean类说:
该类必须具有不带参数的公共构造函数.
这听起来像EJB不允许构造函数注入.
但CDI规范在第3节开头说,会话Bean受CDI支持.然后,第3.2节详细讨论了CDI和EJB,但从未提及有关构造函数注入不起作用的任何内容.这让我觉得它应该被允许.
那么,这些规范是否允许为EJB提供CDI构造函数注入?
我有以下代码来管理两种存储库.两个存储库类都继承一个接口以允许重新初始化其资源.
public interface CachingRepository
{
public void invalidateCache();
}
Run Code Online (Sandbox Code Playgroud)
全局,应用程序范围的回购:
@Named("globalRepo")
@ApplicationScoped
public class GlobalRepository implements CachingRepository
{
private List<Category> categories;
...
@Override
public void invalidateCache()
{
categories = null;
}
...
}
Run Code Online (Sandbox Code Playgroud)
每个用户,会话范围的回购:
@Named("userRepo")
@SessionScoped
//@Stateful // <- NOTE HERE
public class UserRepository implements CachingRepository, Serializable
{
private List<MyFile> files;
@Override
public void invalidateCache()
{
files = null;
}
...
}
Run Code Online (Sandbox Code Playgroud)
将此(不@Stateful)注入上下文时
@Named
@ViewScoped
public class MyHandler implements Serializable
{
@Inject
private UserRepository userRepo;
...
}
Run Code Online (Sandbox Code Playgroud)
有用.但是,在添加 …
我有一组通过反射实例化的类,因此这些类不由CDI容器管理,并且上下文不进行注入.我的问题是,有没有办法在CDI上下文中注册这些类,所以这些类是由上下文管理的?
贝娄,我是如何创建课程的:
String clazz = "org.myorg.thisIsMyClass";
MyClass myClass = Class.forName(clazz).newInstance(); // myClass instance not managed by CDI
Run Code Online (Sandbox Code Playgroud)
如何制作myClassCDI容器管理的实例?
我们有一种情况,我们以Map的形式为我们正在运行的程序提供外部配置.我发现JSR-330依赖注入提供了一种更清晰的方式来在代码中使用该配置映射,而不是传递映射或使用JNDI来获取它.
@Inject @Named("server.username") String username;
Run Code Online (Sandbox Code Playgroud)
让JSR-330实现自动填写此字段.
使用Guice,我可以设置值
bindConstant().annotatedWith(Names.named(key)).to(value);
Run Code Online (Sandbox Code Playgroud)
我希望能够在Weld中做同样的事情(将"server.username"绑定到例如"foobar")并且我理解该机制最有可能是beans.xml,但我更喜欢简单的"将此地图提供给Weld" ,请"代码替代.这样做有什么好办法?
编辑2013-10-16:在调查Dagger,它在编译时工作而不是运行时,我发现我们通常每个程序有10-20个,我们可以使用@Provider每个配置字符串的方法,然后在配置中查找地图.这允许方法特定的行为(包括默认值),提供javadoc的能力,以及将所有这些方法放在同一个类中的能力.它也可以与Weld开箱即用.我正在考虑在博客文章中写一个更全面的解释.
我在浏览jsf项目中的页面时遇到BusyConversationException.如果用户在ajax调用期间尝试导航到另一个页面,则通常会发生这种情况.当用户在单击另一个链接后立即单击链接而不等待加载页面时,也会发生这种情况.
例如,如果用户点击通过类似于下面的代码生成的多个链接,我们肯定会得到此异常.另一个例子是,假设用户在文本字段上输入查询,我们的应用程序进行ajax调用以搜索此查询.在该查询期间,如果用户单击某个按钮以导航到另一个页面,则也会发生BusyConversationException.
<h:commandLink value="#{theProfile.profileName}"
title="#{theProfile.profileName}"
action="#{profileBean.aProfileSelected}">
<f:setPropertyActionListener target="#{currentProfileWebBean.theProfile}" value="#{theProfile}"/>
</h:commandLink>
Run Code Online (Sandbox Code Playgroud)
我能赶上在一个延伸ExceptionHandlerWrapper类中的ExceptionHandler类这种类型的异常,但我不能挽救我目前的状态,我可以为这种情况下做的最好的是,当这个例外发生时重定向到主页.
有没有解决方案来避免这种情况?提前感谢您的回答和评论.
我对@Injectjava ee 6中的注释有疑问:
有什么区别:
@Inject
private TestBean test;
@Inject
private Instance<TestBean> test2;
Run Code Online (Sandbox Code Playgroud)
要参考:
test2.get();
Run Code Online (Sandbox Code Playgroud)
关于Instance的一些信息:http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Instance.html
也许在get()调用之前它不会创建对象?我只是想知道哪一个更适合jvm内存.我认为direct @Inject会直接创建一个对象的实例,即使它没有被appplication使用...
谢谢 !
使用Weld-SE 2.1.2.Final获取bean并从线程调用它时,我遇到以下异常:
线程"main"中的异常org.jboss.weld.context.ContextNotActiveException:WELD-001303:范围类型javax.enterprise.context.RequestScoped没有活动的上下文
我的bean用@RequestScooped注释.如果我注释@ApplicationScoped然后它工作正常,但我需要保留@RequestScooped.
这是一个复制者:
public static void main(String[] args) throws Exception {
Weld weld = new Weld();
WeldContainer container = weld.initialize();
final MyPojo pojo = container.instance().select(MyPojo.class).get();
Thread t = new Thread() {
public void run() {
System.out.println(pojo.ping()); // This call fails
}
};
t.start();
t.join();
System.out.println(pojo.ping()); // This call succeed
weld.shutdown();
}
@RequestScoped
public class MyPojo {
public String ping() {
return "pong";
}
}
Run Code Online (Sandbox Code Playgroud)
你遇到过这种行为吗?有什么想让这个工作好吗?
我正在尝试Greeter在Wildfly 8.2内部运行的EJB上注入给定类型()的对象.但是,部署始终会失败并显示消息
Unsatisfied dependencies for type Greeter with qualifiers @Default
Run Code Online (Sandbox Code Playgroud)
我试图用注释GreeterImpl和注入点注释,@Default但这也没有用.我在这里错过了什么吗?
我的Greeter界面:
public interface Greeter {
public void sayHi();
}
Run Code Online (Sandbox Code Playgroud)
我的GreeterImpl班级(唯一实施的班级Greeter):
public class GreeterImpl implements Greeter {
private static final Logger LOGGER = LoggerFactory.getLogger(GreeterImpl.class);
@Override
public void sayHi() {
LOGGER.info("Hi!");
}
}
Run Code Online (Sandbox Code Playgroud)
我的ScheduledGreeterEJB:
@Stateless
public class ScheduledGreeter {
@Inject
private Greeter greeter;
@Schedule(second = "*/15", minute = "*", hour = "*")
public void sayHi() {
greeter.sayHi(); …Run Code Online (Sandbox Code Playgroud) 我有以下结构:
@Decorator
public abstract class MyDecorator<T extends BaseEntity, Q extends QueryParams> implements EntityService<T, Q> {
@Any
@Inject
@Delegate
EntityService<T, Q> delegate;
@Override
public T save(T entity) { ... }
}
Run Code Online (Sandbox Code Playgroud)
这是EntityService接口声明:
public interface EntityService<T extends BaseEntity, Q extends QueryParams> {
T save(T entity);
void deleteById(Integer id);
void deleteAllById(List<Integer> ids);
void delete(T entity);
void deleteAll(List<T> entities);
T findById(Integer id);
QueryResultWrapper<T> query(Q parameters);
Long count(Q parameters);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,装饰器保存方法永远不会被调用,虽然没有显示错误...我得到它的唯一方法是这样:
@Decorator
public abstract class MyDecorator<T extends BaseEntity> implements EntityService<T> { ... } …Run Code Online (Sandbox Code Playgroud)