我创建了一个非常简单的应用程序,使用持久化上下文(hibernate as provider)从数据库中读取一些值.我将Eclipse与Maven一起使用.
首先,我明白了
Caused by: org.apache.openejb.OpenEJBException: java.lang.ClassCastException: org.hibernate.ejb.HibernatePersistence cannot be cast to javax.persistence.spi.PersistenceProvider:
Run Code Online (Sandbox Code Playgroud)
并根据这个主题 http://openejb.979440.n4.nabble.com/problem-with-hibernate-persistence-provider-td980429.html 我排除了hibernate-jpa-2.0-api.现在,我的依赖项看起来
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901.jdbc4</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.1.3.Final</version>
<exclusions>
<exclusion>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
</exclusion>
</exclusions>
</dependency>
Run Code Online (Sandbox Code Playgroud)
现在,我不知道为什么......
Caused by: java.lang.ClassNotFoundException: org.hibernate.transaction.TransactionManagerLookup
Run Code Online (Sandbox Code Playgroud)
但是TransactionManagerLookup处于hibernate核心.请问,任何人都可以告诉我,在TomEE中如何看待pom.xml使用hibernate?
我正在尝试实现@Restricted注释,以用户只能在登录并具有特定角色时才能访问它们的方式来保护控制器方法.我在使用JSF和CDI的Tomcat 7上,所以没有EJB.只要注释接口未指定任何参数,就会调用拦截器.只要我添加一个@Nonbinding Role value() default Role.ADMIN;参数,拦截器和控制器方法都不会执行.也没有错误或例外.这是我的代码,我真的不知道它有什么问题:
注解:
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface Restricted {
@Nonbinding Role value() default Role.ADMIN; // ###
}
Run Code Online (Sandbox Code Playgroud)
拦截器:
@Interceptor
@Restricted
public class RoleBasedRestrictingInterceptor implements Serializable {
@Inject
ISecurityManager security;
@AroundInvoke
public Object intercept(final InvocationContext ctx) throws Exception {
final Restricted annotation = ctx.getClass().getAnnotation(Restricted.class);
log.info("Intercepted, required role is: {}", annotation.value()); // ###
log.info("User is logged in: {}", security.isLoggedIn());
return ctx.proceed();
}
}
Run Code Online (Sandbox Code Playgroud)
控制器:
@Named("manageUsers")
@SessionScoped
public class ManageUsersBacking extends …Run Code Online (Sandbox Code Playgroud) 考虑以下服务:
@Path("/")
@Stateless
public class SomethingService {
@Context
final HttpServletRequest request
@POST
@Path("post/something/")
@Produces("application/json; charset=UTF-8")
public String addSomething(@FormParam("something") final String something) {
// access to request methods results in NullPointerException
}
}
Run Code Online (Sandbox Code Playgroud)
NullPointerException当方法执行时,我得到了,尽管在调试角度我注意到request它并不是真正的null,而是org.apache.openejb.rest.ThreadLocalHttpServletRequest. 当我将@Context注入移至方法参数级别时,一切正常:
public String addSomething(@FormParam("something") final String something,
@Context final HttpServletRequest request) { ... }
Run Code Online (Sandbox Code Playgroud)
这是什么原因呢?据我记得,在我将服务设为 EJB 之前它曾经可以工作(我这样做是为了使用@EJB或@Inject可能注入 DAO)。JAX-RS 是否为每个请求创建此类服务的实例,因此能够通过类级别注入@Context?EJB 是否会在 JAX-RS 执行任何操作之前通过创建实例并填充代理对象来防止这种情况发生?
apache-tomee ×2
java ×2
annotations ×1
cdi ×1
ejb ×1
hibernate ×1
interceptor ×1
jax-rs ×1
jpa ×1
openejb ×1
resteasy ×1
tomcat ×1