由于EJB 3我们有可嵌入的EJB容器,因此可以在没有应用程序服务器的情况下使用JPA实现,有上下文和依赖注入等的Weld.因为在许多系统上只有Tomcat可用,我想知道,如果Java EE可以在没有应用程序服务器的情况下使用,而是使用像Tomcat这样的Servlet容器.
我需要做什么才能建立Java环境?你看到了什么缺点?
我似乎遇到一个问题,我在rich:popupPanel上有一个a4j:commandLink,但是没有触发动作.xhtml看起来如下:
<rich:popupPanel id="rate-panel" modal="true" height="444" width="780" top="60" show="false" onmaskclick="#{rich:component('rate-panel')}.hide()" styleClass="cs-modal">
/**Some html here**/
<a4j:commandLink immediate="false" action="#{venueScore.up}" render="rate-panel" styleClass="rate love">
<span>Love it</span>
</a4j:commandLink>
/**Some more html here**/
</rich:popupPanel>
Run Code Online (Sandbox Code Playgroud)
托管bean看起来如下:
@Named("venueScore")
@ViewScoped
public class VenueScoreManager extends BaseManager implements Serializable {
public void up() {
System.out.println("TEST");
//Do something
}
}
Run Code Online (Sandbox Code Playgroud)
我已经创建了托管bean @ViewScoped.
我也试过<h:form>在commandLink周围添加一个,但是,这比没有它更少.我实际上认为这是因为commandLink <h:form>位于打开popupPanel的链接所在的位置.
无论如何,有人可以指点我为什么行动不开火?
我有一个名为'name'的字段的bean,以及一个使用此字段映射的inputText的JSF表单.字段的初始值很好地显示在表单上.
问题是当我提交表单时,值不会随inputText的内容更新.在下面的savePlayer()方法中,name的值始终是'name',而不是我在表单输入中输入的值.
豆子:
@Named
@RequestScoped
public class PlayerForm {
@Inject
private PlayerRepository playerRepository;
private String name = "name";
public String savePlayer(){
Player player = new Player();
player.setName(name);
playerRepository.savePlayer(player);
return "saveUserOk";
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
表格 :
<h:form>
<h:inputText value="#{playerForm.name}" />
<h:commandButton value="Submit" action="#{playerForm.savePlayer}" />
</h:form>
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助!
我是这里的新手,也是CDI世界的新手,我在工作中得到的第一项任务就是找到一种控制CDI上传的方法.
我们同时使用EJB 3.1和CDI 1.0,因为它们是由不同的容器控制的,我们可以控制何时和以何种顺序EJB管Bean将达到使用@Startup和@Singleton标注.
但是@Inject我在我的类中声明的CDI bean因为CDI容器尚未启动而变为空.
我已经尝试了好几天来寻找解决方案,而我在这里找到的解决方案没有用(仍然是空的).
我们正在使用Java EE 6并在WebSphere Application Server 8上运行该应用程序.
请问,如果你能帮我找到一种方法来控制内部和不管EJB的CDI上传?
这是一个示例代码:
import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;
@Singleton
@Startup
public class BaseStartupLoader{
/**
* Default constructor.
*/
@Inject @MyStartup
BaseStartUp myStartup;
private static Logger m_logger = LoggerFactory.getLogger(BaseStartupLoader.class);
public BaseStartupLoader() {
}
@PostConstruct
public void init(){
String applicationName = null;
try {
applicationName = myStartup.getClass().getName();
myStartup.load();
} catch (IllegalAccessException e) {
m_logger.error("Faild to load data …Run Code Online (Sandbox Code Playgroud) 我有一个Session scoped bean
import javax.faces.bean.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class SessionBean implements Serializable{
Run Code Online (Sandbox Code Playgroud)
我在一个过滤器中进行了对象...
public class FiltroSeguridad implements Filter{
@Inject
private SessionBean sessionBean;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
sessionBean.setRutaRedirect(httpRequest.getRequestURI());
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我在下一次互动中使用SessionBean ...
@Model
public class CuentaUsuarioWebBean implements Serializable{
@Inject
private SessionBean sessionBean;
public void loginUsuario() throws IOException{
sessionBean.getRutaRedirect();
}
}
Run Code Online (Sandbox Code Playgroud)
但该属性getRutaRedirect()返回null
我通过CDI注释更改导入它仍然不起作用(javax.enterprise.context.SessionScoped),与JSF注释相同(javax.faces.bean.ManagedBean和@ManagedProperty).
谢谢.
PD:对不起我的英文!
我需要使用AOP来解决特定问题,但它是一个小型的独立Java程序(没有Java EE容器).
我可以使用javax.interceptor功能,还是必须下载一些第三方AOP实现?如果可能的话,我宁愿使用Java SE SDK附带的东西.
运行:Apache Tomcat 7.0.47 OmniFaces 1.6.3 JSF Mojarra 2.1.26 CDI Weld 2.1.0.Final
RuntimeException通过访问JNDI"java:comp/BeanManager",Threre是Apache Tomcat 7.0.47上的一个.CDI BenManager必然会java:comp/env/BeanManager在您的BeanManager类中无法到达.
/**
* Perform automatic initialization whereby the bean manager is looked up from the JNDI. If the bean manager is
* found, then invoke {@link #init(Object)} with the found bean manager.
*/
private void init() {
if (!initialized.getAndSet(true)) {
try {
Class.forName("javax.enterprise.inject.spi.BeanManager"); // Is CDI present?
Class.forName("javax.naming.InitialContext"); // Is JNDI present? (not on Google App Engine)
}
catch (Exception e) {
return; …Run Code Online (Sandbox Code Playgroud) 使用@ApplicationScoped @Named @Eager,my @EJB-injected @Statelessbean没有正确实例化并进行评估null.
我有一个@ApplicationScoped @ManagedBean(eager=true)习惯于安排一些工作的人.一些@Statelessbean使用@EJB注释注入,并且工作正常.
在转向CDI注释时,我添加了OmniFaces@Eager注释作为@ManagedBean(eager=true)标准CDI中缺少的注释:
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.omnifaces.cdi.Eager;
@Named
@ApplicationScoped
@Eager
public class MyScheduler implements Serializable {
@EJB
private MyService myService;
@Inject
private MyNamedBean myNamedBean;
@PostConstruct
public void init() {
setupSchedulers();
}
@PreDestroy
public void destroy() {
destroySchedulers();
}
//...
}
Run Code Online (Sandbox Code Playgroud)
使用此设置,@PostConstruct在应用程序启动时正确调用该方法(尽管它似乎甚至在初始化上下文之前运行),但随后myService进行求值null.
在日志中,将显示以下警告: …
我有一个JSF,CDI项目的问题.我做了很多研究,我发现在CDI中没有@ViewedScoped注释.我用对话框解决了基于ajax的页面的问题.我想从datatable传递变量到对话框.为此,我不能使用@RequestedScopedbean,因为在请求结束后丢弃值.任何人都可以帮我解决吗?我不能用,@SessionScoped但这是一个不好的做法恕我直言.或者也许只将这一个变量保存到知道的会话中.你们能给我任何提示如何优雅地解决这个问题吗?
import javax.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class ServiceBean implements Serializable {
...
Run Code Online (Sandbox Code Playgroud)
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class SomeBean {
@Inject
ServiceBean serviceBean;
@Postconstruct ...
Run Code Online (Sandbox Code Playgroud)
这是错误消息:
com.sun.faces.mgbean.ManagedBeanCreationException: An error occurred performing resource injection on managed bean warDetailBean
Run Code Online (Sandbox Code Playgroud) 我有一个简单的AttributeConverter实现,我尝试注入一个必须提供转换逻辑的对象,但@Inject似乎不适用于这种情况.转换器类看起来像这样:
@Converter(autoApply=false)
public class String2ByteArrayConverter implements AttributeConverter<String, byte[]>
{
@Inject
private Crypto crypto;
@Override
public byte[] convertToDatabaseColumn(String usrReadable)
{
return crypto.pg_encrypt(usrReadable);
}
@Override
public String convertToEntityAttribute(byte[] dbType)
{
return crypto.pg_decrypt(dbType);
}
}
Run Code Online (Sandbox Code Playgroud)
当@Converter触发它时会抛出一个NullPointerException因为该属性crypto没有从容器初始化.这是为什么?
我正在使用Glassfish 4,在所有其他情况下@Inject工作得很好.
是否无法在转换器上使用CDI?
任何帮助将不胜感激 :)
我的问题的重点是AttributeConverter部分.我知道,要使CDI工作,bean必须满足http://docs.oracle.com/javaee/6/tutorial/doc/gjfzi.html所述的条件.我也尝试通过实现以下构造函数来强制CDI工作:
@Inject
public String2ByteArrayConverter(Crypto crypto)
{
this.crypto = crypto;
}
Run Code Online (Sandbox Code Playgroud)
现在我得到以下异常,但没有给我任何线索:
2015-07-23T01:03:24.835+0200|Severe: Exception during life cycle processing
org.glassfish.deployment.common.DeploymentException: Exception [EclipseLink-28019] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: …Run Code Online (Sandbox Code Playgroud)