ValidationEventHandler JBOSS 7.2.x

时间:2014-01-19 20:06:05

标签: java web-services validation jboss

JBOSS 7.x可以通过在SEI上使用@SchemaValidation批注来激活服务器端的模式验证。

但是我也想自定义我的错误。此外,我想将异常更改为报告(结果)。

我在Stack Overflow上发现了以下question / answer。其中介绍了如何使用CXF设置自定义ValidationEventHanlder。但是,JBOSS使用它自己的方式覆盖CXF的部署描述符。通过JBOSS Web服务部署描述符,可以获得与@Schemavalidation相同的结果。但是,我还没有激活自己的事件处理程序。

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

问题:

1)是否可以在JBOSS 7.x.x(或JBOSS 6.x.x EAP)中设置ValidationEventHander?

2)是否可以覆盖默认异常(不对非致命错误抛出异常,如范围,格式等?)并返回结果?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

  1. 通过Servlet或EJB中的@Resource注释提供的WebService Context
  2. 可以链接到“后来的拦截器”的CXF WebService上下文。
  3. 后者可以通过setContextualProperty的menas获得。

    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));
        }
    }
    

    这是插入的验证器:

    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;
        }
    }
    

    验证器将List添加到1.中描述的上下文中,现在可用于EJB或Servlet中的进一步处理。然后SEI看起来像这样:

    @SchemaValidation 
    @InInterceptors(classes = {ValidatingInterceptor.class})
    @Stateless
    public class LogicBean implements SEI
    

    注意:@SchemaValidation仍然需要作为注释,因为它首先触发注释。