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,设置 提供 此依赖项的范围。
现在一切正常。
我找不到解决方案,但我发现有更多人遇到同样的问题,所以我将 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,设置 提供 此依赖项的范围。 现在一切正常。