JBoss7.x可以通过在SEI上使用@SchemaVal环流注释来激活服务器端的模式验证。
不过,我也想自定义我的错误。此外,我想将例外情况改为报告(结果)。
我在堆栈溢出上找到了下面的question / answer。说明如何使用CXF设置自定义ValidationEventHanlder。但是,JBOSS以自己的方式使用部署描述符覆盖CXF描述符。可以通过JBOSS服务部署描述符实现与@Schem崩化相同的结果。但是,我还不能激活我自己的事件处理程序。
我考虑的不是抛出异常,而是将验证结果存储在header或ThreadLocal中,以便创建自己的结果。
问题:
1)是否可以在JBoss7.x.x(或JBoss6.x.xEAP)中设置ValidationEventHander?
( 2)是否可以覆盖默认异常(不对非致命错误(如范围、格式等)抛出异常)?还会有结果吗?
谢谢!
发布于 2014-02-18 09:20:28
JBoss7.x使用了一个名为“拦截器”的概念。通过定义拦截器,可以访问消息上下文。有两种不同的信息背景:
后者可以通过setContextualProperty的菜单获得。
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;
}
}验证器将列表添加到1.中描述的上下文中,现在可以在EJB或Servlet中进行进一步处理。然后,SEI看起来如下:
@SchemaValidation
@InInterceptors(classes = {ValidatingInterceptor.class})
@Stateless
public class LogicBean implements SEI注意:由于这首先触发了注释,所以仍然需要使用@SchemaValidation作为注释。
https://stackoverflow.com/questions/21221969
复制相似问题