首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValidationEventHandler JBOSS 7.2.x

ValidationEventHandler JBOSS 7.2.x
EN

Stack Overflow用户
提问于 2014-01-19 20:06:04
回答 1查看 618关注 0票数 0

JBoss7.x可以通过在SEI上使用@SchemaVal环流注释来激活服务器端的模式验证。

不过,我也想自定义我的错误。此外,我想将例外情况改为报告(结果)。

我在堆栈溢出上找到了下面的question / answer。说明如何使用CXF设置自定义ValidationEventHanlder。但是,JBOSS以自己的方式使用部署描述符覆盖CXF描述符。可以通过JBOSS服务部署描述符实现与@Schem崩化相同的结果。但是,我还不能激活我自己的事件处理程序。

我考虑的不是抛出异常,而是将验证结果存储在header或ThreadLocal中,以便创建自己的结果。

问题:

1)是否可以在JBoss7.x.x(或JBoss6.x.xEAP)中设置ValidationEventHander?

( 2)是否可以覆盖默认异常(不对非致命错误(如范围、格式等)抛出异常)?还会有结果吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-18 09:20:28

JBoss7.x使用了一个名为“拦截器”的概念。通过定义拦截器,可以访问消息上下文。有两种不同的信息背景:

  1. 通过Servlet或EJB中的@Resource注释提供的WebService上下文
  2. CXF WebService上下文,可用于链中的“稍后拦截器”。

后者可以通过setContextualProperty的菜单获得。

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.ValidationEvent;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;

public class ValidatingInterceptor extends AbstractPhaseInterceptor<Message> {

    public static String CTX_KEY_VALIDATOR_EVENTS = "event_key";

    public ValidatingInterceptor() {
        super(Phase.READ);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        List<ValidationEvent> validationRes = new ArrayList<ValidationEvent>();
        message.put(CTX_KEY_VALIDATOR_EVENTS, validationRes);
        message.setContextualProperty("jaxb-validation-event-handler", new XmlValidationHandler(validationRes));
    }
}

下面是插入的验证器:

代码语言:javascript
复制
import java.util.List;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;

public class XmlValidationHandler implements ValidationEventHandler {
    private final List<ValidationEvent> results;

    public XmlValidationHandler(List<ValidationEvent> results) {
        this.results = results;
    }

    @Override
    public boolean handleEvent(ValidationEvent event) {
        results.add(event);
        return true;
    }
}

验证器将列表添加到1.中描述的上下文中,现在可以在EJB或Servlet中进行进一步处理。然后,SEI看起来如下:

代码语言:javascript
复制
@SchemaValidation 
@InInterceptors(classes = {ValidatingInterceptor.class})
@Stateless
public class LogicBean implements SEI

注意:由于这首先触发了注释,所以仍然需要使用@SchemaValidation作为注释。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21221969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档