我的一个合作伙伴需要一个SOAP接口,所以我想:让我们转移到一个应用服务器.我选择了Glassfish,开箱即用.我无法做到这一点:将@SessionScoped ManagedBean注入@Webservice注释EJB.
我可以访问EJB的唯一方法是通过JNDI.我在这里读到它
我的问题是:Glassfish中是否有一个错误,它将在未来的版本中运行,或者它应该工作,我做错了什么.
我希望能够DataAccess session使用@EJB注释注入属性但它不起作用.
以下是测试项目中的所有文件
这是我的WebService类:
@LocalBean
@Stateless
@WebService()
public class MySOAP implements Serializable {
private DataAccess session;
@WebMethod
public String getUsername() {
javax.naming.Context ctx = null;
try {
ctx = new javax.naming.InitialContext();
session = ( DataAccess ) ctx.lookup( "java:comp/env/DataAccess" );
return "user is " + session.getData();
} catch ( NamingException e ) {
e.printStackTrace();
}
return "exception occured";
}
}
Run Code Online (Sandbox Code Playgroud)
我想要注入的EJB:
public abstract class AbstractDataBean {
@Inject /* this just returns …Run Code Online (Sandbox Code Playgroud) 我正在评估CDI事件是否对我的新应用程序有意义.到目前为止,我总是使用MVP架构,其中View只有UI元素并在公共getter中公开它们,而Presenter寄存器点击它们上的监听器.
我来到这里CDI Events并考虑View直接在类中触发click事件,而只是observe在我的Presenters.
你能告诉我哪种方法更好吗?或者为什么你一般会选择一种方法呢?
MVP:
class LoginView {
private Button loginButton;
public void getButton() {
return loginButton;
}
}
class LoginPresenter {
@Inject
private LoginView view;
public LoginPresenter() {
view.getButton.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
//perform the login business logic
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
CDI活动:
class LoginView {
private Button loginButton;
@Inject
private Events<LoginEvent> events;
public LoginView() {
loginButton.addClickListener(new …Run Code Online (Sandbox Code Playgroud) 如何创建一个根据参数创建对象的生成器方法?
我的目标是能够CrudService在我的应用程序中注入不同的类,但是使用服务所用的类(例如User.class)来对其进行参数化.
以下代码当然不起作用,但说明了我的意图.
@Produces
@JPAContainer(Class type) //something like this?
public JPAContainer getJPA() {
@PersistenceContext
private EntityManager em;
@Produces
@JPAContainerAnnot
public JPAContainer getJPAContainer() {
return JPAContainerFactory.make(type, em); //eg: class = User.class, Person.class
}
}
@Stateless
public class CrudServiceUser() {
@Inject
@JPAContainer(type = User.class) //something like this parameter
private JPAContainer container;
}
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({FIELD,METHOD,PARAMETER,TYPE})
public @interface JPAContainer {
}
Run Code Online (Sandbox Code Playgroud) 我在使用Wildfly通过@Inject注入POJO时遇到了一些麻烦.文件明确指出:
@Dependent - 如果未指定,则为默认范围; 这意味着一个对象只存在一个客户端(bean),并且与该客户端(bean)具有相同的生命周期.
但是,当我有两个班级时:
@Singleton
@Startup
public class A{
@Inject
private B b;
}
public class B{
public B(){}
}
Run Code Online (Sandbox Code Playgroud)
我一直在:
注入点上带有限定符@Default的类型B的不满意依赖[BackedAnnotatedField] @Inject [...]
当我添加@Dependent时,一切都像魅力一样.我错过了什么吗?这种行为是野生蝇特有的吗?希望你能帮忙,谢谢.
我在Java SE应用程序中使用CDI(Weld).我做了一个Bean让我们称之为BeanA.
public class BeanA {
@PostConstruct
public void init() {
System.out.println("INIT");
}
public void receive(@Observes String test) {
System.out.println("received: " + test);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的测试方法中,我调用:
Weld weld = new Weld();
WeldContainer container = weld.initialize();
Instance<BeanA> instance = container.instance().select(BeanA.class);
BeanA bean = instance.get();
container.event().fire("TEST");
container.event().fire("TEST");
container.event().fire("TEST");
container.event().fire("TEST");
Run Code Online (Sandbox Code Playgroud)
为什么输出是这样的?为什么每次收到事件都会调用@PostConstruct?:
INIT
INIT
recived:TEST
INIT
recived:TEST
INIT
recived:TEST
INIT
recived:TEST
我正在使用Netbeans 8.0.2.我使用File - > New Project - > Java Web:Web Application创建了一个非常简单的(什么是JSF)Web应用程序.
我试图在我的index.xhtml页面中打印一个@Named bean的实例变量,但它没有按预期工作.我正在使用Netbeans中的绿色"运行项目"按钮部署应用程序,该按钮自动打包,部署和启动浏览器.
在web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>MyContext</param-name>
<param-value>null</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
Run Code Online (Sandbox Code Playgroud)
的index.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Facelets Hello Greeting</title>
</h:head>
<h:body>
<!-- I am expecting the beans name …Run Code Online (Sandbox Code Playgroud) 1) CDI @Interceptor 的@Priority 是什么意思?
2)它与 beans.xml 中声明的拦截器顺序有什么关系?
3) @Priority 可以在 xml 文件中被覆盖吗?
假设我有一个Web服务/一个使用某些HTTP标头参数调用的REST资源。resource方法构建一个复杂的数据对象(当前为POJO),并最终将其返回给客户端(通过Gson作为JSON,但这无关紧要)。
所以我有这个调用层次结构:
@Path(foo) ProjectResource @GET getProject()
-> new Project()
-> new List<Participant> which contains lots of new Participant()s
-> new Affiliation()
Run Code Online (Sandbox Code Playgroud)
如果我想Affiliation根据标题参数以英语或德语填充对象,则必须将其作为参数传递给链下。我想避免这样做。也许这从根本上讲是不可能的,但是感觉太不对了。所有这些对象仅存在于请求中,因此能够从任何地方访问与请求相关的信息是否方便?
我希望我可以例如定义一个CDI @RequestScoped对象,该对象会初始化自身(或由某些WebFilter填充),然后可以在可能需要的位置注入。
但是显然,这在POJO内部是行不通的,而且我也很难从请求范围的对象内部获取标头。
我已经阅读了许多关于EJB,JAX-RS上下文和CDI的SO问题/答案,但是我无法解决。
我期望太多了吗?传递参数确实是首选选项吗?
我想整合JavaFX和CDI.网上有一些关于这些的好例子:
https://dzone.com/articles/fxml-javafx-powered-cdi-jboss http://fxapps.blogspot.com.br/2017/10/using-cdi-20-in-javafx-application.html
但是,我看到的所有示例都不能在现实世界中工作,因为它们无法注入多个Stage(primaryStage),如果它们是,我不知道如何.
所以我想知道在JavaFX/CDI项目中是否可以注入多个Stage(例如在模态窗口中使用......)
谢谢!
在 Spring DI 中,将自动装配字段声明为 Optional 使客户端不会向其注入任何值。这可以使用 Java EE 的 CDI 吗?我试过 Optional 但它失败了。我想知道是否有我可以使用的等效机制。
这是我尝试过的:
public class OmeletteMaker implements EggMaker{
public static void main(String[] args){
WeldContainer container = new Weld().initialize();
OmeletteMaker omeletteMaker = container.instance().select(OmeletteMaker.class).get();
}
@Inject
Optional<Vegetable> vegetable;
}
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息:线程“main”org.jboss.weld.exceptions.DeploymentException 中的异常:WELD-001408 Unsatisfied dependencies for type [Optional] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject cafeteria.OmeletteMaker 。蔬菜]
cdi ×10
java ×5
java-ee ×3
ejb ×1
glassfish-3 ×1
jakarta-ee ×1
java-ee-6 ×1
javafx-8 ×1
jax-rs ×1
jpa ×1
jsf ×1
managed-bean ×1
soap ×1
vaadin ×1
wildfly ×1