【问题标题】:Server-side schema validation with JAX-WS使用 JAX-WS 进行服务器端模式验证
【发布时间】:2013-01-18 20:46:56
【问题描述】:

我有 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容器。在我的情况下,我不能使用容器,我需要嵌入式服务。我还能使用架构验证吗?

【问题讨论】:

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


    【解决方案1】:

    老问题,但我使用正确的包和最少的配置解决了这个问题,以及仅使用 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;
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      1. 下载the most recent metro release.
      2. 在某处解压。
      3. jaxb-api.jarjaxws-api.jar 添加到您的类路径中。例如,您可以通过将它们放入 JAVA_HOME/lib/endorsed 或手动将它们添加到您的项目中来做到这一点。这在很大程度上取决于 IDE 或您使用的任何东西。

      完成此操作后,您的MyErrorHandler 应该可以工作,即使它是通过Endpoint.publish() 部署的。至少我在本地有这个设置,它可以编译和工作。

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

      【讨论】:

      • 您的意思可能是jaxws-rt.jar。无论如何,我只是将所有 JAR(JavaDoc 除外)放入项目类路径中,现在我的验证处理程序工作正常。谢谢!
      • 嗯,我试图验证这一点,但由于某种原因无法让处理程序停止工作,尽管我删除了对这些 jar 的所有依赖项,并将它们从 JAVA_HOME/lib/endorsed 中删除。它们必须被缓存在我现在找不到的地方......将在另一台机器上重试。无论如何,我很高兴这对你来说是一个解决方案:)
      猜你喜欢
      • 2012-12-22
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 2014-10-08
      相关资源
      最近更新 更多