`
wangcheng
  • 浏览: 1463454 次
  • 性别: Icon_minigender_1
  • 来自: 青岛人在北京
社区版块
存档分类
最新评论

在Seam中自定义interceptor拦截器

阅读更多

我这里的Seam项目使用war方式部署,所以seam的action是POJO而不是EJB。
下面是最终的使用效果,在类上添加自定义的@MySeam, 在需要控制的Field上添加自定义的@SuperString

@Name("productAction")
@MySeam
public class ProductAction {
	
	@SuperString
	String name;
	
	@SuperString(postfix="-product")
	String product;

	... ...
}
 

下面说说具体怎么做,先写一个Interceptor如下例

import org.jboss.seam.annotations.intercept.AroundInvoke;
import org.jboss.seam.annotations.intercept.Interceptor;
import org.jboss.seam.security.SecurityInterceptor;
import org.jboss.seam.core.EventInterceptor;
import org.jboss.seam.core.MethodContextInterceptor;
import org.jboss.seam.intercept.AbstractInterceptor;
import org.jboss.seam.intercept.InvocationContext;
import org.jboss.seam.util.Reflections;

/**
 * MySeamInterceptor will be invoke
 * before MethodContextInterceptor, EventInterceptor
 * after SecurityInterceptor
 */
@Interceptor(around = {
        MethodContextInterceptor.class,
        EventInterceptor.class,
        },
		within = SecurityInterceptor.class
)
public class MySeamInterceptor extends AbstractInterceptor {

	private static final long serialVersionUID = -3064515871691261357L;
	
	private static final LogProvider log = Logging.getLogProvider(MySeamInterceptor.class);
	
	private boolean reentrant; //OK, since all Seam components are single-threaded

	@AroundInvoke
	public Object aroundInvoke(InvocationContext invocation) throws Exception {
		if (reentrant) {
			if (log.isTraceEnabled()) {
				log.trace("reentrant call to component: " + getComponent().getName());
			}
			return invocation.proceed();
			
		} else {

			reentrant = true;
			try {
				//Component component = getComponent();

				changeStringValue(invocation.getTarget());
				
				// you can add more method in here.
				
				return invocation.proceed();

			} finally {
				reentrant = false;
			}
		}
	}

	private void changeStringValue(Object target) {
		Field[] fieldArray = target.getClass().getDeclaredFields();
		for (Field field : fieldArray) {
			if (!field.isAccessible()) {
				field.setAccessible(true);
			}
			if (field.isAnnotationPresent(SuperString.class)) {
				SuperString superStr = field.getAnnotation(SuperString.class);
				String newValue = System.currentTimeMillis() + superStr.postfix();
				setFieldValue(field, target, newValue);
			}
		}
	}

	/**
	 * Set field value.
	 * @param field		The value will be set for this field
	 * @param target	The field belongs to this object
	 * @param value		The field's value
	 */
	private void setFieldValue(Field field, Object target, Object value) {
		try {
			Reflections.set(field, target, value);
		} catch (Exception e) {
			throw new IllegalArgumentException("MySeamInterceptor.setFieldValue(): " + 
					target.getClass() + "; field: " + field.getName(), e);
		}
	}
}
 

继承AbstractInterceptor是比较容易的方式,@AroundInvoke是必须的。
这里的逻辑很简单:在所有标注了@MySeam的类中,寻找标注了@SuperString的Field,并给其赋值。

 

为了使用MySeamInterceptor,我们需要为它定义一个Annotation,如下:

import org.jboss.seam.annotations.intercept.Interceptors;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Interceptors(MySeamInterceptor.class)
public @interface MySeam {

}

 

最后是@SuperString,这个就不多说了。

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD)
public @interface SuperString {

	String postfix() default "-super";
}
 
分享到:
评论
5 楼 langren 2009-08-04  
非常感谢你的回复!!!!

我还有问题要请教

@Scope(ScopeType.SESSION)
@Name("logAction")
@SysAnnotationType
public class LogAction extends BaseAction implements Serializable {
……
    @SysAnnotationMethod(value="searchObjects")
    public void searchObjects() {

    }
}

我在应用的时候是上面那样写的

然后注解是下面这样写的
SysAnnotationType

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.jboss.seam.annotations.intercept.Interceptors;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Interceptors(SysInterceptor.class)
public @interface SysAnnotationType {

}

SysAnnotationMethod

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SysAnnotationMethod {
    String value();
}
拦截器SysInterceptor类和您写的一模一样
可是拦截器在程序运行的时候不起作用
您能帮我看看是哪里出了问题吗?
4 楼 wangcheng 2009-08-04  
不是MySeam调用MySeamInterceptor,而是MySeamInterceptor将数据注入到MySeam所标注的对象里。其他的跟写一个普通的Annotation一样
3 楼 langren 2009-08-04  
我刚接触seam框架,要实现拦截器,思路应该和楼主一样,看了楼主的代码还是云里雾里的,能不能多给一点解释呢?我将感激不尽
MySeam是怎么调用MySeamInterceptor的
public @interface MySeam
public @interface SuperString
2 楼 wangcheng 2009-03-31  
可以用JNDI查
1 楼 blacklong 2009-03-31  
我在war包里用普通的javabean做拦截器,能拦截,
但是我想调用一下jar包里的ejb,不知道怎么调用它……
注入的写法不起作用,用JNDI查找,用XXXBean/local也找不到,
可以调用EJB吧?
画面有个下拉框,想在任何按钮的实际处理开始前,check一下选择的值在DB是否被删除了。

相关推荐

    jboss seam 中文文档集合

    《JSF标签》简体中文版.pdf涵盖了JSF的各种组件、转换器、验证器以及与后台数据交互的方法,有助于提升开发者在JSF项目中的效率。 **4. A4J (Ajax for JSF)** A4J 是一个扩展JSF的库,提供了一套AJAX支持,允许...

    SEAM 中文开发指南

    - **在Jboss4.0下使用Seam**: - **安装JBoss4.0**:确保 JBoss 版本兼容。 - **安装JSF1.2RI**:满足 SEAM 的运行环境要求。 #### 四、上下文相关的组件模型 - **Seam上下文**: - **无状态上下文**:适用于一...

    JbossSeam中文开发指南.docx

    Seam拦截器提供了一个统一的编程模型,能够将JSF、EJB、JPA等技术整合在一起,提供了一个强大且灵活的开发环境。 Seam异常处理 Seam异常处理是一个基于异常处理的编程模型,能够帮助开发者快速构建企业级应用程序...

    seam 中文文档 pdf

    seam 中文文档 pdf 格式 JSF+EJB3.0快速开发框架Seam的中文版向导。。。

    jboss seam 中文文档

    - **拦截器**:在 Seam 中,拦截器被用来增强组件的行为,如权限检查、日志记录等。 - **组件名字**:每个 Seam 组件都需要有一个唯一的名称,以便于引用和配置。 - **定义组件作用域**:通过配置文件或注解,可以...

    JBOSS SEAM组件中文手册

    1. **Faces Context增强**: 在Seam 2.0中,对JSF的Faces Context进行了扩展,提供了更多的上下文信息和操作。 2. **CDI支持**: 虽然Seam 2.0发布时,Contexts and Dependency Injection (CDI)规范还未正式发布,但...

    seam需要的jar包

    在这个“seam需要的jar包”压缩包中,包含了运行和开发Seam应用程序所需的各种库文件。 首先,Seam框架的核心依赖于JSF,这是Java EE中的一个用户界面组件框架,用于构建交互式Web应用。JSF提供了模型-视图-控制器...

    seam的注解和标签

    在Seam框架中,注解和标签起着至关重要的作用,它们简化了代码并增强了可读性。下面我们将详细讨论Seam中的注解以及与之相关的标签。 1. **Seam注解** - `@Name`: 这是Seam的核心注解,用于为组件定义一个唯一的...

    seam in action 中文 english

    7. **国际化与本地化**:Seam支持多语言环境,对于中英文双语版本的书籍,这为开发者提供了跨越语言障碍的便利,帮助全球的开发者理解和使用Seam框架。 8. **测试支持**:Seam提供了一套完整的测试工具,包括单元...

    《SeamInAction》+《JbossSeam》+《官方中文指南》

    此外,Seam还支持CDI,这使得开发者可以利用更多的Java EE特性,如拦截器和异步处理。 总之,拥有《Seam In Action》、《JBoss Seam》和《官方中文指南》这些资源,开发者可以系统地学习和精通Seam框架,从而在企业...

    jboss seam 学习资料,seam in action和官方手册

    6. **国际化与本地化**:学习如何在Seam项目中实现多语言支持。 7. **测试与调试**:掌握Seam的测试工具和策略,确保代码质量。 8. **Seam组件**:了解如Conversation、Transactions、邮件服务等Seam内置组件的使用...

    Seam security

    在Seam Security中,可以基于JAAS进行自定义配置以满足特定需求。 6. 安全需求:Seam Security的设计目标是让设置变得简单,易于管理,并确保应用程序不会因为安全性扩展而变得过于复杂,即应用程序不应该因安全...

    JSF项目中seam的配置

    这是Seam启动的基础,监听器会在JSF的生命周期中插入Seam特有的行为,比如对话管理。Seam通过这个监听器能够增强JSF的各个阶段,并引入CONVERSATION生命周期,这是Seam的一个核心特性。 ```xml ...

    seam参考手册中文版

    - **拦截器**: 为组件提供额外的行为扩展点,如日志记录、安全性检查等。 - **组件命名规则**: 为了确保组件名称的唯一性和易于识别,Seam定义了一套规范化的命名机制。 ##### 组件范围定义 - **定义组件作用域**: ...

    seam级联菜单例子

    在这个“seam级联菜单例子”中,我们将深入探讨如何在Seam应用中实现级联选择菜单,这种菜单在用户界面中常见于如国家/地区、省份/城市等层级结构的选择。 级联菜单通常涉及到Ajax技术,它允许部分页面更新而不是...

    seam in action

    - **高级特性**:支持自定义事件、拦截器等功能。 4. **绝对反转控制(Absolute Inversion of Control)** - **概念解释**:AIOC是一种更高级的依赖注入模式,在Seam中允许组件在运行时动态决定其依赖关系。 - **...

    jboss seam中文资料

    这份资料提供了丰富的示例代码和项目,通过这些实例,开发者可以深入理解Seam的工作原理以及如何在实际项目中应用它。这种方法能够确保理论与实践相结合,使学习过程更加高效。 #### 四、核心特性详解 - **组件模型...

    seam 2中文手册

    seam下一代web开发框架

Global site tag (gtag.js) - Google Analytics