使用JAX-WS进行服务器端模式验证

时间:2013-02-04 07:07:38

标签: validation xsd jax-ws jax-ws-customization

我有JAX-WS无容器服务(从Endpoint.publish()方法通过main()发布)。我希望我的服务验证输入消息。我尝试过注释:@SchemaValidation(handler=MyErrorHandler.class)并实现了一个合适的类。当我开始服务时,我得到以下内容:

Exception in thread "main" javax.xml.ws.WebServiceException: 
Annotation @com.sun.xml.internal.ws.developer.SchemaValidation(outbound=true,
inbound=true, handler=class mypackage.MyErrorHandler) is not recognizable, 
atleast one constructor of class 
com.sun.xml.internal.ws.developer.SchemaValidationFeature 
should be marked with @FeatureConstructor

我在互联网上找到了few solutions,所有这些都意味着使用了WebLogic容器。在我的情况下我不能使用容器,我需要嵌入式服务。我还可以使用架构验证吗?

2 个答案:

答案 0 :(得分:3)

JAX-WS规范中未定义@SchemaValidation注释,但验证保持打开状态。这意味着您需要的不仅仅是jdk中的类。

只要您能够在类路径中添加一些jar,就可以使用metro(它也包含在WebLogic中)轻松设置它。这就是您找到使用WebLogic作为容器的解决方案的原因。)。更准确地说,您需要在类路径中添加两个jar。我建议

  1. 下载the most recent metro release
  2. 将其解压缩到某处。
  3. jaxb-api.jarjaxws-api.jar添加到您的类路径中。例如,您可以将它们放入JAVA_HOME/lib/endorsed或手动将它们添加到项目中来执行此操作。这在很大程度上取决于IDE或您正在使用的任何内容。
  4. 完成此操作后,即使MyErrorHandler部署Endpoint.publish(),{{1}}也应有效。至少我在本地进行了这种设置,它可以编译并运行。

    如果您无法修改类路径并需要验证,则必须使用JAXB手动验证请求。

答案 1 :(得分:2)

老问题,但我使用正确的包和最小配置解决了问题,并且仅使用WebLogic提供的服务。我遇到了和你一样的问题。

请确保使用正确的java类型I described here

由于我计划扩展到跟踪机制,我还实现了自定义错误处理程序。

带有自定义验证处理程序的Web服务

import com.sun.xml.ws.developer.SchemaValidation;

@Stateless
@WebService(portName="ValidatedService")
@SchemaValidation(handler=MyValidator.class)
public class ValidatedService {

    public ValidatedResponse operation(@WebParam(name = "ValidatedRequest") ValidatedRequest request) {

        /* do business logic */

        return response;
    }
}

自定义处理程序,用于记录和存储数据库中的错误

public class MyValidator extends ValidationErrorHandler{

    private static java.util.logging.Logger log = LoggingHelper.getServerLogger();

    @Override
    public void warning(SAXParseException exception) throws SAXException {
        handleException(exception);
    }

    @Override
    public void error(SAXParseException exception) throws SAXException {
        handleException(exception);
    }

    @Override
    public void fatalError(SAXParseException exception) throws SAXException {
        handleException(exception);
    }

    private void handleException(SAXParseException e) throws SAXException {
        log.log(Level.SEVERE, "Validation error", e);
        // Record in database for tracking etc
        throw e;
    }
}