标签: java-ee-6

如何在Java EE中建模?

比方说,我决定使用Java EE堆栈来实现我的企业应用程序.

现在,对于域建模(或:用于设计MVC的M),我可以安全地假设和使用哪些API,哪些我应该远离......比如说,通过抽象层?

例如,

  1. 我应该继续使用Hibernate/JPA API调用我的模型吗?或者,我应该构建一个抽象...我自己的持久层,以避免对这两个特定的持久性API进行硬编码?为什么我这样问:几年前,这个Kodo API被Hibernate取代了.如果设计了一个持久层并对该层编码模型的其余部分(而不是通过调用特定的供应商API来乱丢模型),那么它将允许一个(相对)轻松地从Kodo切换到Hibernate到xyz.

  2. 是否建议在域模型中积极使用持久性供应商提供的*QL?我不知道由于大量使用类似HQL的语言而产生的任何现实问题(如性能,可伸缩性,可移植性等).为什么我这样问:我希望尽可能避免编写自定义代码,这可以通过比SQL更便携的查询语言来实现.

对不起,我是这个地区的新手.我在哪里可以找到关于此主题的更多信息?

modeling java-ee data-persistence java-ee-6

11
推荐指数
1
解决办法
2652
查看次数

JavaMail的DCH类错误

我正在尝试使用Glassfish 3.1提供的jar文件在Java EE 6中使用JavaMail设置简单的日志记录测试.关于这个问题似乎有很多问题,但我还没有找到任何有帮助的答案.我的测试代码如下所示:

import java.util.logging.Logger;

public class MyClass {
  private static final Logger LOGGER = Logger.getLogger("MyClass");

  public static void main(String[] args) {
    LOGGER.severe("This is a test");
  }
}
Run Code Online (Sandbox Code Playgroud)

我的logging.properties文件包含以下内容:

com.sun.mail.util.logging.MailHandler.mail.smtp.host={my mail hub FQDN}
com.sun.mail.util.logging.MailHandler.mail.smtp.port=25
com.sun.mail.util.logging.MailHandler.mail.to={me}
com.sun.mail.util.logging.MailHandler.mail.from={support address}
com.sun.mail.util.logging.MailHandler.level=WARNING
com.sun.mail.util.logging.MailHandler.verify=local
com.sun.mail.util.logging.MailHandler.subject=Application Error
com.sun.mail.util.logging.MailHandler.formatter=java.util.logging.SimpleFormatter
Run Code Online (Sandbox Code Playgroud)

我使用以下方法构建类:

javac -cp $AS_INSTALL/glassfish/modules/javax.mail.jar:$AS_INSTALL/install/lib/external/jaxb/activation.jar:. MyClass.java
Run Code Online (Sandbox Code Playgroud)

然后我运行程序使用:

java -cp $AS_INSTALL/glassfish/modules/javax.mail.jar:$AS_INSTALL/install/lib/external/jaxb/activation.jar:. -Djava.util.logging.config.file=logging.properties MyClass
Run Code Online (Sandbox Code Playgroud)

这会导致以下错误:

Sep 22, 2011 4:19:25 PM MyClass main
SEVERE: This is a test
java.util.logging.ErrorManager: 3: SEVERE: no object DCH for MIME type multipart/mixed;
        boundary="----=_Part_1_26867996.1316722766145"
javax.activation.UnsupportedDataTypeException: no …
Run Code Online (Sandbox Code Playgroud)

logging glassfish jakarta-mail java-ee-6

11
推荐指数
4
解决办法
1万
查看次数

枚举字段的JSR-303 Bean验证

我有一个简单的豆enum

public class TestBean{
   @Pattern(regexp = "A|B") //does not work
   private TestEnum testField;
   //getters + setters
}

enum TestEnum{
  A, B, C, D
}
Run Code Online (Sandbox Code Playgroud)

我想testField使用Bean Validation进行验证.具体来说,我想确保只允许A和B值(对于特定的calidation gropus).似乎enum没有处理JSR 303(我试图使用@Pattern验证器)或者我正在以错误的方式做某事.

我得到例外:

javax.validation.UnexpectedTypeException: No validator could be found for type: packagename.TestEnum
Run Code Online (Sandbox Code Playgroud)

有没有办法验证枚举字段而无需编写自定义验证器?

java-ee bean-validation java-ee-6

11
推荐指数
3
解决办法
2万
查看次数

10
推荐指数
2
解决办法
4551
查看次数

Java EE 6注释继承的神秘面纱

我在几个场景中使用EJB继承,有时在超类中使用注释,就像这个通用实体DAO:

public class JpaDAO<T>{
    protected Class<T> entityClass;

    @PersistenceContext(unitName="CarrierPortalPU")
    protected EntityManager em;
    protected CriteriaBuilder cb;

    @PostConstruct
    private void init() {
        cb = em.getCriteriaBuilder();
    }

    public JpaDAO(Class<T> type) {
        entityClass = type;
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void create(T entity) {
        em.persist(entity);
    }

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public T find(Object id) {
        return em.find(entityClass, id);
    }

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<T> findAll(){
        CriteriaQuery<T> cq = cb.createQuery(entityClass);
        Root<T> entity = cq.from(entityClass);
        cq.select(entity);
        return em.createQuery(cq).getResultList();
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void remove(T entity) {
        em.remove(em.merge(entity));
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public T edit(T entity) {
        return …
Run Code Online (Sandbox Code Playgroud)

inheritance annotations java-ee-6 jpa-2.0 ejb-3.1

10
推荐指数
1
解决办法
6905
查看次数

可以使用@Resource在EJB3.0中注入原语吗?

使用Glassfish,我可以设置一个字符串jndi条目:

JNDI name: "com/xyzcompany/echo/EchoServiceBean/viewName"
Factory Class: org.glassfish.resources.custom.factory.PrimitivesAndStringFactory
Properties: value="Testing123"

然后我可以将这个容器配置的字符串注入我的EJB:

    @Resource(lookup = "com/xyzcompany/echo/EchoServiceBean/viewName")
    String viewName;

lookup =似乎在内部执行InitialContext.lookup(...).但是,这使用ejb3.1,但不幸的是我的prod环境只有ejb3.0.

我想我想弄清楚是否有办法使用@Resource(name =)或@Resource(mappedName =)做类似的事情?name =似乎是特定于应用程序的,所以我应该能够以某种方式将相对名称映射到全局JNDI名称,但我无法弄清楚映射的注释.

谢谢!

java glassfish ejb-3.0 java-ee-6 ejb-3.1

10
推荐指数
1
解决办法
9260
查看次数

清理代码,无状态会话bean和私有状态

根据Robert C. Martin的干净代码方法应该有一个小签名.最好的情况是没有参数的方法.相反,建议使用状态变量.这非常有用.但是无状态会话bean呢?

这个名字有点令人困惑,因为SLSB可以拥有州.您只需要进行内务管理,这样就不会使用先前EJB调用中的状态.

回到干净的代码:我也喜欢在SLSB中使用实例变量.这样可以正常工作,如果你足够小心,你就不会遇到状态不一致的问题,因为每次公共方法调用都会覆盖状态.

到现在为止还挺好.但是如果用过的bean回到池中会发生什么?它采取了它的状态.根据状态的大小,这可能是真正的内存泄漏.JBoss对bean非常慷慨,产生了大量的bean,导致一些严重的内存消耗 - 一无所获.

因此,一种方法是在bean方法存在之前清理状态,并将bean返回到池中.但在我看来,这应该是无用的代码.

有没有正确的方法来处理这个问题?在这种情况下,最佳做法是什么?

java coding-style ejb-3.0 java-ee-6 ejb-3.1

10
推荐指数
1
解决办法
1071
查看次数

分析java进程的线程转储

我在tomcat上运行基于Java EE的应用程序,我看到应用程序在运行几个小时后突然挂起.

我在应用程序挂起之前从应用程序中收集了线程转储并将其放入TDA进行分析:

在此输入图像描述

TDA(线程转储分析器)为上述监视器提供以下消息:

A lot of threads are waiting for this monitor to become available again.
This might indicate a congestion. You also should analyze other locks 
blocked by threads waiting for this monitor as there might be much more 
threads waiting for it.
Run Code Online (Sandbox Code Playgroud)

这是上面突出显示的线程的堆栈跟踪:

"MY_THREAD" prio=10 tid=0x00007f97f1918800 nid=0x776a 
             waiting for monitor entry [0x00007f9819560000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.util.Hashtable.get(Hashtable.java:356)
    - locked <0x0000000680038b68> (a java.util.Properties)
    at java.util.Properties.getProperty(Properties.java:951)
    at java.lang.System.getProperty(System.java:709)
    at com.MyClass.myMethod(MyClass.java:344)
Run Code Online (Sandbox Code Playgroud)

我想知道"waiting for monitor entry"国家意味着什么?并且也会感谢任何帮助我调试此问题的指针.

java thread-dump java-ee-6

10
推荐指数
2
解决办法
1万
查看次数

我在哪里可以在Java EE 6中配置@Asynchronous调用后面的线程池?

我最近了解到,通过简单地添加注释,我可以轻松地使任何会话bean方法异步@Asynchronous.

例如

@Asynchronous
public Future<String> processPayment(Order order) throws PaymentException {
    ... 
}
Run Code Online (Sandbox Code Playgroud)

我知道Java EE 7添加了Concurrency Utilities,但在Java EE 6中,方法的线程池配置在@Asyncronous哪里?有没有办法设置超时?它是一个固定的线程池吗?一个缓存的?什么是优先事项?它可以在容器中的某个位置配置吗?

java java-ee java-ee-6 glassfish-3

10
推荐指数
1
解决办法
3285
查看次数

Java EE6计划范围

我需要有一个从上午10点到下午5点45分每5分钟运行一次的时间表,如何使用@Schedule注释执行此操作?

到目前为止,我只限于@Schedule(小时= 10-18;分钟=*/5),但是他们坚持要到下午5:45而不是下午6点.

java cron ejb java-ee java-ee-6

10
推荐指数
1
解决办法
195
查看次数