14

私はJava EE 6とJboss AS7.1を使用しており、インターセプターバインディングを使用しようとしています( jbossサイトの例)。

InterceptorBinding アノテーションがあります。

@InterceptorBinding
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface GeoRestrictedEquipment {
}

インターセプター:

@GeoRestrictedEquipment
@Interceptor
public class GeoRestrictedEquipmentInterceptor {

    @EJB EquipmentDao equipmenttDao;    
    @EJB SecurityService securityService;    

    @AroundInvoke
    public Object checker(InvocationContext ctx) throws Exception {
        Integer id = (Integer) ctx.getParameters()[0];
        Equipment equipment = equipmenttDao.findById(id);
        GeoChecker.check(equipment.getSite(), securityService.getUser());

        return ctx.proceed();
    }
}

そして豆:

@Stateless
@LocalBean
@SecurityDomain(Realm.NAME)
@RolesAllowed({ Roles.REGISTERED })
public class PumpService implements PumpServiceLocal {

    @Override
    @GeoRestrictedEquipment
    public PumpInfos getPumpInfos(Integer pumpId) {
        /* ... */
    }
}

しかし、インターセプターは呼び出されません...例から何が欠けていますか?

これを書くと、インターセプターが呼び出されます。

@Override
@Interceptors({GeoRestrictedEquipmentInterceptor.class})
public PumpInfos getPumpInfos(Integer pumpId) {
    /* ... */
}

ご協力いただきありがとうございます。

4

3 に答える 3

17

ドキュメントによると、beans.xml を使用する代わりに別の方法があります。

@Priority アノテーションを使用する場合、beans.xml ファイルでインターセプターを指定する必要はありません。

@Logged
@Interceptor
@Priority(Interceptor.Priority.APPLICATION)
public class LoggedInterceptor implements Serializable { ... }

そして、それは機能します。

于 2015-11-19T10:07:15.623 に答える
14

参照されている例で説明されているように、インターセプターを有効にしましたか?

デフォルトでは、Beanアーカイブには、インターセプターバインディングを介してバインドされた有効なインターセプターがありません。インターセプターは、Beanアーカイブのbeans.xmlファイルの要素の下にそのクラスをリストすることによって明示的に有効にする必要があります。

于 2012-08-22T21:23:19.013 に答える