尽管我努力寻找有关该主题的答案,但我最终空手而归。我想知道的是,在EJB / CDI实现开始搜索带注释的类之前,是否有可能(或者之前已经尝试过)以编程方式生成类。如果我要求的解决方案不存在,我可以自己创建。我想要的是使用Java EE 6/7堆栈,以减少我为一些常见任务创建的类似(和样板)代码的数量。
不仅仅是问,我会展示一个我想要实现的例子。假设您有一个这样的业务实体:
@Entity
public class User {
@Id
private Long id;
@NotNull
private String login;
/* ... */
}
假设我有一个所述实体的业务层接口:
@Local
public interface UserService {
User findByLogin(String login);
}
为了避免必须实现那些简单的方法,我想注释实体,如...
@Entity
@BusinessLayer(
name = "Users",
ejbInterfaces = { UserService.class },
ejbType = EjbType.STATELESS,
persistenceContextUnitName = "users-PU"
)
@NamedQueries({
@NamedQuery(
name = "User.findByLogin",
query = "select o from User o where o.login = :login"
hints = {
@QueryHint(name = BusinessLayerQueryHints.QUERY_TYPE, value = "entity_search")
}
)
})
public class User {
/* ... */
}
...可能的运行时可以通过代理或字节码以编程方式创建一个类,例如:
@Stateless(name = "users")
public class Users__RuntimeImpl {
@PersistenceContext(unitName = "users-PU")
private EntityManager em;
public User findByLogin(String login) {
User user = null;
boolean validUserLogin = /* validating a single property */;
if (validUserLogin) {
// Because of the entity_search hint
TypedQuery<User> query = em.createNamedQuery("User.findByLogin");
query.setParameter("login", login);
user = query.getSingleResult(); // May be exchanged for a getResultList().get(0);
}
return user;
}
}
应用程序服务器可以加载Users__RuntimeImpl
并将其用于注入,就像对任何其他“静态”创建的类所做的那样。
我想像ShrinkWrap这样的东西是我正在寻找的东西,但我并不完全确定(例如,保证ShrinkWrap在部署之前启动,并且动态JAR被部署为应用程序的依赖项)。另外,我不确定在Web配置文件中运行此类运行时的可行性。
我不害怕深入研究特定于实现的应用程序服务器信息,只要这样的库能够与Java EE技术互操作。