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

JAX-WS Validate Schema in WebLogic with @SchemaValidation

我找不到解决方案,但我发现有更多人遇到同样的问题,所以我将 post 放在这里。


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

这会导致很多问题,因为任何无效值(错误的 xsd:dateTime 格式、数字字段中的字母等)都会导致 null 值在 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 */
    }
}

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

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

我不想实现任何自定义验证器。服务器应该通过简单直接的配置提供此类服务。

问题是:我为 @SchemaValidation 使用了错误的包。

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

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

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

Enabling Schema Validation on the Server 页面中的更多信息。

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

就我而言:具有许多模块的 Maven 项目。我在尝试将应用程序部署到 tomcat:

时遇到下一个错误

无法解析运行时描述符:javax.xml.ws.WebServiceException: Annotation @com.sun.xml.ws.developer.SchemaValidation(handler=class com.sun.xml.ws.server.DraconianValidationErrorHandler) 无法识别,至少有一个class com.sun.xml.ws.developer.SchemaValidation特征的构造函数应该用@FeatureConstructor

标记

我通过不在 WEB-INF/lib 中包含 jaxws-rt.jar 来解决问题。 这个库似乎已经存在于 tomcat/lib 文件夹中。

刚刚调整 pom.xml,设置 提供 此依赖项的范围。 现在一切正常。