在ejb类加载之前,将编程生成的类插入到应用程序部署中,是否可能?

时间:2015-05-23 22:32:05

标签: java java-ee

尽管我努力寻找有关该主题的答案,但我最终空手而归。我想知道的是,在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技术互操作。

0 个答案:

没有答案