我无法找到解决方案而且我发现更多人遇到了同样的问题,所以我会在这里发布。
默认情况下,JAX-WS服务器(至少对于WebLogic)不会验证使用其关联模式接收的消息。
这会导致很多问题,因为任何无效值(错误的xsd:dateTime格式,数字字段上的字母等)都会在Java对象中产生 null 值,包括强制字段。
我需要做的是一个应该由服务器提供的简单验证。
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
我不希望实现任何自定义验证器。服务器应该提供这种类型的服务,配置简单直接。
答案 0 :(得分:4)
问题是:我使用了错误的包@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。 internal ...但是使用WebLogic提供的包立即工作。
如果您使用Maven并使用捆绑的JAR作为依赖项,则可能在类路径中没有此库,这导致了我的问题。您需要通过依赖项(仅provided
范围)将其添加到类路径中,并在JAX-WS WebService类中引用该类名的正确包(一个抽象类不会这样做)。
Enabling Schema Validation on the Server页面中的更多信息。
此模式验证对我来说已经足够了,因为我不需要任何自定义行为。
答案 1 :(得分:0)
就我而言:Maven项目有很多模块。尝试将应用程序部署到tomcat时出现了下一个错误:
无法解析运行时描述符:javax.xml.ws.WebServiceException:Annotation @ com.sun.xml.ws.developer.SchemaValidation(handler = class com.sun.xml.ws.server.DraconianValidationErrorHandler)is不可识别的,com.sun.xml.ws.developer.SchemaValidationFeature类的至少一个构造函数应该用@FeatureConstructor标记
我通过在WEB-INF / lib中包含 jaxws-rt.jar 来解决问题。 该库已经存在于tomcat / lib文件夹中。
刚刚调整了pom.xml,为此依赖项创建了提供的范围。 现在一切正常。