我正在开发一个JEE6应用程序,使用JPA 2.0和Hibernate 3.5.2-Final作为Provider(和MySQL 5.1.41).我的应用服务器是Glassfish V3.0.1.我已经有一个有一些实体和关系的工作CRUD应用程序.
现在我添加了一个名为"Group"的(非常简单的)实体.实体类看起来像这样:
package model
//Imports...
@Entity
public class Group {
@Id @GeneratedValue
private Long id;
@NotNull
private String name;
//Getters and Setters
}
Run Code Online (Sandbox Code Playgroud)
当然我也把它添加到了persistence.xml中,就像<class>model.Group</class>.我的persistence.xml在部署时删除并重新创建所有表.
因此,当我部署应用程序时,将生成除我的表组之外的所有实体的表.在hibernate日志中,我发现了以下错误(这不会阻止部署应用程序)
[#|2010-06-30T11:54:29.862+0200|INFO|glassfish3.0.1|org.hibernate.cfg.AnnotationBinder|_ThreadID=11;_ThreadName=Thread-1;|Binding entity from annotated class: model.Group|#]
[#|2010-06-30T11:54:29.862+0200|INFO|glassfish3.0.1|org.hibernate.cfg.annotations.EntityBinder|_ThreadID=11;_ThreadName=Thread-1;|Bind entity model.Group on table Group|#]
[#|2010-06-30T11:54:33.773+0200|SEVERE|glassfish3.0.1|org.hibernate.tool.hbm2ddl.SchemaExport|_ThreadID=11;_ThreadName=Thread-1;|Unsuccessful: create table Group (id bigint not null auto_increment, name varchar(255) not null, primary key (id))|#]
[#|2010-06-30T11:54:33.773+0200|SEVERE|glassfish3.0.1|org.hibernate.tool.hbm2ddl.SchemaExport|_ThreadID=11;_ThreadName=Thread-1;|You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right …Run Code Online (Sandbox Code Playgroud) 我在Java EE 6中遇到了一个相当奇怪的情况,其中使用JPA EntityManager的find方法以及实体的主id返回null,但使用Criteria API选择具有该id的所有实体都可以正常工作.
这是我正在使用的代码find:
// Always returns null, even for records I know for sure are in there.
user = em.find(User.class, userId);
Run Code Online (Sandbox Code Playgroud)
...这里是我使用Criteria API的代码:
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> criteria = builder.createQuery(User.class);
Root<User> u = criteria.from(User.class);
TypedQuery<User> query = em.createQuery(
criteria.select(u).where(builder.equal(u.get("id"), userId)));
user = query.getSingleResult();
Run Code Online (Sandbox Code Playgroud)
任何想法为什么find返回null但Criteria找到用户?我在程序中的完全相同的位置尝试了这两种替代方法.
以下是User实体的相关部分:
@Entity
@Table(name = "USERS")
@Access(AccessType.PROPERTY)
public class User implements Serializable {
...
private Long id;
...
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_id_generator")
@SequenceGenerator(name = …Run Code Online (Sandbox Code Playgroud) 我试图找出,可以通过@Resource注释注入无状态会话Bean.我在哪里可以找到一份清单?它取决于容器(在我的例子中是Glassfish 3.1.1)吗?
我正在努力弄清楚为什么我的EJB中的@Asynchronous方法实际上并没有异步调用.我正在使用CDI(带有beans.xml)在JBoss AS 7上运行JSF2项目,并使用Maven生成的简单.war包装.
EJB与.war一起打包,以及与之交互的JSF2托管bean.这是一个简单的@Stateless EJB.通过将它(通过@Inject)注入到调用其@Asynchronous方法的JSF2托管bean中来使用它.
而不是立即返回Future的@Asynchronous方法调用,它同步执行,就好像它是一个普通的未经代理的直接调用.无论我使用本地无接口视图还是本地业务接口来调用EJB,都是如此.
@Remote bean只支持@Asynchronous吗?如果是这样,它可以在.war包装中工作,还是我必须在EAR中打包EJB jar才能获得这个功能?
例如简化代码,每个类在.war中的同一个包中:
public interface SomeEJB {
public Future<Void> doSomething();
}
@Stateless
@Local(SomeEJB.class)
public class SomeEJBImpl implements SomeEJB {
@Asynchronous
@Override
public Future<Void> doSomething() {
// Spend a while doing work
// then:
return new AsyncResult<Void>(null);
}
}
@Named
@RequestScoped
public class JSFBean {
@Inject private transient SomeEJB someEJB;
private Future<Void> progress;
// Called from JSF2, starts work and re-displays page
public String startWorkAction() {
// This call SHOULD return a Future immediately. …Run Code Online (Sandbox Code Playgroud) 我有@Statelessbean实现两个接口(远程和本地).我还添加@LocalBean了用于通过无接口视图访问bean的anotation.
@Stateless
@LocalBean
public class WeatherDataBean implements WeatherDataBeanRemote, WeatherDataBeanLocal {
@Inject
private EntityManager entityManager;
public WeatherDataBean () {
}
// ....attributes, getter & setter methods ....
}
Run Code Online (Sandbox Code Playgroud)
我使用@Inject这个原因取自JBoss AS7快速启动的这个例子:
我们使用来自CDI的"资源生成器"模式,将实体管理器的旧式@PersistenceContext注入"别名"为CDI样式注入.这允许我们在整个应用程序中使用一致的注入样式(@Inject).
以前我用过:
@PersistenceContext(unitName="WeatherStationJPA")
private EntityManager entityManager;
Run Code Online (Sandbox Code Playgroud)
在EJB中,它没有任何问题.但是使用@Inject注释我得到这个错误:
WELD-001408在注入点[[field] @Inject private ejb.WeatherDataBean.entityManager]中带有限定符[@Default]的[EntityManager]类型的不满意依赖项
这是我如何定义类资源:
public class Resources {
@SuppressWarnings("unused")
@PersistenceContext(unitName="WeatherStationJPA")
@Produces
private EntityManager entityManager;
@Produces
FacesContext getFacesContext() {
return FacesContext.getCurrentInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试注入实体管理器,为什么会出现此错误?
编辑: 根据@LightGuard的请求,我正在添加我用来引用注释的包:
WeatherDataBean有:
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.inject.Inject; …Run Code Online (Sandbox Code Playgroud)dependency-injection stateless-session-bean entitymanager cdi java-ee-6
我正在尝试结合以下技术的Java webapp:
我为我的JSF页面提供了基于CDI的后台bean(@ViewScoped,@ Name).
我使用@Stateless EJB bean来完成实际工作.
我只需要很少的会话信息,如jSessionCookie(由容器管理),内部用户名和一些其他内部ID.现在,我想知道在哪里放置这个会话信息,以便我可以在JSF的支持bean中访问它,还可以将它提供给无状态EJB?我应该使用@Stateful EJB会话bean还是应该使用@SessionScoped和@Named创建基于CDI的POJO?
有没有最佳做法?
这是在WAS8.0上运行的JSF 2应用程序.这是一个页面的"支持"bean的代码.
@Named("mySessionBean")
@SessionScoped
@Stateful
@LocalBean
@StatefulTimeout(unit = TimeUnit.MINUTES, value = 10)
public class MySessionBean implements Serializable {
@PostConstruct
public void init()
{
System.out.println("start MySessionBean: " + this.hashCode());
}
@PreDestroy
public void cleanup()
{
System.out.println("destroy MySessionBean: " + this.hashCode());
}
....
}
Run Code Online (Sandbox Code Playgroud)
web.xml中设置的会话超时值小于bean的超时.当我运行应用程序时,我看到来自@PostConstruct的打印输出,但从未看到来自@PreDestroy的打印输出.我尝试了以下两种方案:1.logout - invalidateSession; 2.只需等到会话到期.
我不是应用程序的设计者.设计者坚持将所有支持bean作为有状态会话bean.我认为更主流的方法就是让它们成为CDI bean.但无论如何,当我确实将注释更改为CDI时,我也开始从@PreDestroy获取打印输出
@Named("mySessionBean")
@SessionScoped
public class MySessionBean implements Serializable {
.....
Run Code Online (Sandbox Code Playgroud)
我的问题是,在第一种情况下我没有得到@PreDestroy方法调用的原因是什么?如果我不能看到@PreDestroy被调用,在那里我可以跟踪"后盾" bean的生命周期(在这种情况下,有状态会话Bean)的任何其他方式.谢谢!
我正在实现一个复合组件,我发现了一个我找不到解决方案的问题.
我指定了页面作者可以传递或不传递的属性,但我无法指定方法属性(Action的方法表达式),如果未传递,则复合组件不使用method属性在composite:implementation标签中.
这是我的代码:
<composite:interface>
<composite:attribute name="namePrompt" required="true"/>
<composite:attribute name="actionMethod" method-signature="java.lang.String action()" required="false"/>
<composite:attribute name="showComponent" default="false"/>
</composite:interface>
<composite:implementation>
<div>
<p:commandLink actionListener="#{cc.attrs.actionMethod}"
rendered="#{cc.attrs.showComponent}"
>
<h:outputText value="#{cc.attrs.namePrompt}"/>
</p:commandLink>
</div>
</composite:implementation>
Run Code Online (Sandbox Code Playgroud)
使用它时,我没有指定"actionMethod"属性.像这样:
<util:foo namePrompt="SomeName" showComponent="true"/>
Run Code Online (Sandbox Code Playgroud)
但我收到错误消息:
javax.faces.FacesException: Unable to resolve composite component from using page using EL expression '#{cc.attrs.actionMethod}'
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
我是ejbs的新手,我想知道有状态会话bean是否会被销毁.我在servlet中注入了一个有状态会话bean.即使在30分钟后,我发现豆子是活跃的.我正在使用jboss eap 6.0.我相信HttpSession与有状态会话bean无关.我使HttpSession失效,以确保HttpSession与statful会话bean无关.那么,如果我的应用程序有很多用户,如果我创建一个新bean,那么我的服务器的性能就会降低.容器如何管理有状态会话bean.豆被移除或销毁的时间是什么时候?
我读过这篇文章和其他几篇文章.但我没有明白.
我有一个@AroundInvoke REST Web服务拦截器,我想用它来记录常见数据,如类和方法,远程IP地址和响应时间.
使用InvocationContext获取类和方法名称很简单,只要被拦截的Rest服务在其参数列表中包含@Context HttpServletRequest,就可以通过HttpServletRequest获得远程IP.
但是有些REST方法的参数中没有HttpServletRequest,在这些情况下我无法弄清楚如何获取HttpServletRequest对象.
例如,以下REST Web服务没有@Context HttpServletRequest参数
@Inject
@Default
private MemberManager memberManager;
@POST
@Path("/add")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Member add(NewMember member) throws MemberInvalidException {
return memberManager.add(member);
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试将它直接注入我的拦截器,但是(在JBoss 6.1上)它总是为空...
public class RestLoggedInterceptorImpl implements Serializable {
@Context
HttpServletRequest req;
@AroundInvoke
public Object aroundInvoke(InvocationContext ic) throws Exception {
logger.info(req.getRemoteAddr()); // <- this throws NPE as req is always null
...
return ic.proceed();
Run Code Online (Sandbox Code Playgroud)
我想建议一种可靠的方法来访问HttpServletRequest对象 - 甚至只是Http Headers ...无论REST服务是否包含参数.
java-ee-6 ×10
java-ee ×4
cdi ×2
ejb ×2
ejb-3.1 ×2
hibernate ×2
java ×2
jpa-2.0 ×2
jsf-2 ×2
criteria-api ×1
ejb-3.0 ×1
interceptor ×1
jax-rs ×1
jboss ×1
jboss-weld ×1
jboss7.x ×1
jpa ×1
orm ×1
websphere-8 ×1