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)是否可以覆盖默认异常(不对非致命错误抛出异常,如范围,格式等?)并返回结果?
谢谢!
答案 0 :(得分:0)
JBOSS 7.x使用了一个名为“拦截器”的概念。通过定义拦截器,可以访问消息上下文。有两种风格的消息背景:
后者可以通过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仍然需要作为注释,因为它首先触发注释。