2

次のコンポーネントを使用して、単純な Java ee アプリケーションを開始しようとしています: JSF 2.0、JPA EclipseLink、Glasshfish 3.

ここにいくつかのスニペット、バッキング Bean があります。

@Inject
private ProductsFacade model;    
public void saveRow(Products p) {
        model.edit(p);
}

製品ファサード:

@Stateless
public class ProductsFacade extends AbstractFacade<Products> {
    @PersistenceContext
    private EntityManager em;
    public void edit(Products entity) {
        em.merge(entity);
    }
    ....

Products は、Bean 検証アノテーションを持つエンティティー Bean です。

ユーザーがフォームに間違って入力すると、'model.edit' が EjbException をスローします。キャッチで処理するため、saveRowバッキング Bean メソッドはそれほど簡潔ではありません。

public void saveRow(Products p) {
    try {
        model.edit(p);
    } catch (EJBException e) {
        if(e.getCause().getClass().getName().equals("javax.validation.ConstraintViolationException")) {
            handleConstraintViolation((ConstraintViolationException)e.getCause());
        }
    }
}

そしてまだ「警告: javax.ejb.EJBException」と長いトレースで満たされたグラスフィッシュのログ。いくつか質問があります:

  1. 私のセットアップはどのくらい正しいですか?jsf が BeanValidation を処理する必要があることは知っていますが、私の場合はそうではありません。
  2. EJBExceptionサーバーログが汚染されないように警告を無効にする方法
  3. EjbException を処理するより良い方法はありますか?
4

1 に答える 1

1

EJBException■ 現在の JTA トランザクションをキャッチするかどうかに関係なく、そのロールバックをトリガーします。への呼び出しProductsFacade#edit()は、SessionBean への「外部からの」呼び出しであるため、トランザクションを開始します (トランザクションが伝搬されない限り、ここではそうではないようです)。これらのシナリオでトランザクションをロールバックさせたくない場合は、に破損Entityを与える前に、ユーザー/クライアントの入力をどこかで検証する必要がありEntityManagerます。

この状況を回避するために、ここで行うべきいくつかの癖やことがあります。たとえば、ProductsFacadeハンドル transactions:を持つことができますが@TransactionManagement(TransactionManagementType.BEAN)、これは EJB を使用するポイントの大部分を奪います。このデフォルトの動作は本来あるべきものだと思います。ログにロールバックが必要ない場合は、ログ レベルなどを構成できますが、EJB レイヤード トランザクション ロールバックはログに属していると思いますが、開発中は間違いありません。

于 2012-08-06T18:23:41.073 に答える