JAX-WS 使用 @SchemaValidation 验证 WebLogic 中的架构

Eva*_*tti 1 java web-services weblogic jax-ws

我无法找到解决方案,而且我发现更多人遇到了同样的问题,所以我将其发布在这里。


默认情况下,JAX-WS 服务器(至少对于 WebLogic)不会验证接收到的消息及其关联模式。

这会导致很多问题,因为任何无效值(错误的 xsd:dateTime 格式、数字字段上的字母等)都将导致Java 对象中的值,包括必填字段。

我需要做的是应该由服务器提供的简单验证。

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

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

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

        /* do stuff */
    }
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,当我尝试使用提供的架构验证时,出现以下异常:

Caused By: javax.xml.ws.WebServiceException: Annotation @com.sun.xml.internal.ws.developer.SchemaValidation(handler=class com.sun.xml.internal.ws.server.DraconianValidationErrorHandler) is not recognizable, atleast one constructor of class com.sun.xml.internal.ws.developer.SchemaValidationFeature should be marked with @FeatureConstructor
Run Code Online (Sandbox Code Playgroud)

我不希望实现任何自定义验证器。服务器应该通过简单直接的配置来提供这种类型的服务。

Eva*_*tti 5

问题是:我使用了错误的@SchemaValidation.

对我有用的正确类是com.sun.xml.ws.developer.SchemaValidation,它在文件中提供mw_home\modules\glassfish.jaxws.rt_1.3.0.0_2-1-5.jar(使用 WLS 10.3.6)。

在前面的代码段中,我引用了错误的包:com.sun.xml。内部……但使用 WebLogic 提供的方法立即生效。

如果您使用 Maven 并使用捆绑的 JAR 作为依赖项,您可能在类路径中没有这个库,这导致了我的问题。您需要通过依赖项(provided仅限范围)将其添加到您的类路径中,并在您的 JAX-WS WebService 类中引用该类名的正确包(抽象类不会这样做)。

服务器页面上的启用架构验证中的更多信息。

目前这种模式验证对我来说已经足够了,因为我不需要任何自定义行为。