我觉得Java EE 6规范有点乱.有几组注释.
我们有javax.ejb
类似于@Stateful
和@Stateless
创建EJB的注释.
还有一个@javax.annotation.ManagedBean
用于创建托管bean.
javax.enterprise.context
喜欢@SessionScoped
和注释中有注释@RequestScoped
.
更重要的是也有@ManagedBean
和@SessionScoped
/ @RequestScoped
在注释javax.faces.bean
包.
为了使事件更复杂,有一个javax.inject
带@Named
注释的包.
有人可以描述一下他们之间的关系吗?
我在哪里可以使用@EJB
,@Inject
或@ManagedPropery
注入其他豆类?
我试图理解javax.inject
包,我不清楚javax.inject.Named
注释应该用于什么.Javadoc没有解释它背后的想法.
Javadoc位于http://download.oracle.com/javaee/6/api/javax/inject/Named.html
我使用Spring 3.0编写一些示例程序,通过@Named
添加bean似乎将它添加到bean工厂但Javadoc描述很轻,我不知道这是标准行为还是Spring特定行为.
我的问题是:
@Named
和之间有什么区别@Qualifier
@Component
春天?更新1有一个很好的解释,@Named
并@Qualifier
在尼斯文章@Named
和@Qualifier
http://java.dzone.com/articles/java-ee6-cdi-named-components感谢@xmedeko链接到它下面的评论.
我很难理解两者如何相互作用以及它们之间的界限在哪里.它们是否重叠?他们之间有冗余吗?
我知道有两个注释都有关联,但我无法通过简短的描述找到两者的完整列表.不确定这是否有助于弄清楚它们之间的区别或重叠的位置.
真的只是困惑.我(我认为)合理地理解EJB,我想我很难理解CDI带来的确切内容以及它如何取代或增强EJB已经提供的内容.
我现在正在开始一个新项目.我必须选择技术.我需要一些简单的东西,所以没有EJB或Seam.另一方面,我需要JPA(Hibernate或替代)和JSF与IceFaces.
您是否认为在Tomcat上部署的Spring 3上的这样一个堆栈是一个不错的选择?或者Java EE 6 Web应用程序可能更好?我担心Java EE 6是一项新技术,尚未有详细记载.Tomcat似乎比Glassfish 3更容易维护.
你怎么看?你有经验吗?
我们计划从头开始编写Web应用程序,已经决定使用符合Java EE 6标准的最新版Glassfish,因此我们正在分析是否可以使用CDI而不是Spring.
我们可以说CDI可以替代Spring吗?
你知道是否有一个列表包含Java EE 6的每个组件的所有参考实现?即GlassFish是参考容器,Hibernate Validator用于验证等.
我正在开发一个Java企业应用程序,目前正在使用Java EE安全性来限制特定用户对特定功能的访问.我配置了应用程序服务器和所有内容,现在我使用RolesAllowed-annotation来保护方法:
@Documented
@Retention (RUNTIME)
@Target({TYPE, METHOD})
public @interface RolesAllowed {
String[] value();
}
Run Code Online (Sandbox Code Playgroud)
当我使用这样的注释时,它工作正常:
@RolesAllowed("STUDENT")
public void update(User p) { ... }
Run Code Online (Sandbox Code Playgroud)
但这不是我想要的,因为我必须在这里使用String,重构变得困难,并且可能发生拼写错误.因此,我想使用Enum值作为此注释的参数,而不是使用String.Enum看起来像这样:
public enum RoleType {
STUDENT("STUDENT"),
TEACHER("TEACHER"),
DEANERY("DEANERY");
private final String label;
private RoleType(String label) {
this.label = label;
}
public String toString() {
return this.label;
}
}
Run Code Online (Sandbox Code Playgroud)
所以我尝试使用Enum作为这样的参数:
@RolesAllowed(RoleType.DEANERY.name())
public void update(User p) { ... }
Run Code Online (Sandbox Code Playgroud)
但是后来我得到了以下编译器错误,虽然Enum.name只返回一个String(它总是不变的,不是吗?).
注释属性RolesAllowed.value的值必须是常量表达式`
我尝试的下一件事是在我的枚举中添加一个额外的最终字符串:
public enum RoleType {
...
public static final String STUDENT_ROLE = STUDENT.toString();
...
}
Run Code Online (Sandbox Code Playgroud)
但这也不能作为参数,导致相同的编译器错误:
// The …
Run Code Online (Sandbox Code Playgroud) 我一直在尝试从Glassfish AdminConsole部署我的Web应用程序(战争),但我不断收到以下错误消息 -
Exception while loading the app : Error in linking security policy for MyApp-war -- Inconsistent Module State.
Run Code Online (Sandbox Code Playgroud)
但是当我从Netbeans那里部署它时,它没有任何问题.(在部署应用程序之前,我不知道Netbeans是否正在做一些我缺少的事情.)
我也尝试使用最新版本的Glassfish(即V3.1.1(版本12)),我可以在AdminConsole中部署相同的应用程序而不会出现任何问题.
我正在使用Glassfish 3.1(build 43)和Netbeans 7.0.
在使用此版本的Glassfish部署我的应用程序之前,是否有任何安全策略设置?
我正在开始使用JBoss进行开发,我将它作为独立使用.我在生产环境中读到JBoss应该作为一个域.
我搜索了一下,了解它之间有什么区别.但我没有发现任何文件得到很好的解释.
我应该如何测试获取EntityManager实例的EJB 3.1?
一个可能的EJB:
@Stateless
@LocalBean
public class CommentService {
@PersistenceContext
private EntityManager em;
public List<Comment> findAll() {
TypedQuery<Comment> query = em.createNamedQuery(
Comment.FIND_ALL, Comment.class
);
return query.getResultList();
}
}
Run Code Online (Sandbox Code Playgroud)
可能的测试:
@Test
public void testFindAll() {
List<Comment> all = service.findAll();
Assert.assertEquals(8, all.size());
}
Run Code Online (Sandbox Code Playgroud)
我只使用GlassFish 3.1和Eclipse Indigo for Java EE Developers.我已经尝试过这样的事情:
@Before
public void setUp() throws Exception {
ejbContainer = EJBContainer.createEJBContainer();
service = (CommentService) ejbContainer.getContext()
.lookup("java:global/classes/CommentService");
}
Run Code Online (Sandbox Code Playgroud)
但我得到的只是:
javax.ejb.EJBException:
No EJBContainer provider available: no provider names had been found.
Run Code Online (Sandbox Code Playgroud)