我有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容器。在我的情况下我不能使用容器,我需要嵌入式服务。我还可以使用架构验证吗?
答案 0 :(得分:3)
JAX-WS规范中未定义@SchemaValidation
注释,但验证保持打开状态。这意味着您需要的不仅仅是jdk中的类。
只要您能够在类路径中添加一些jar,就可以使用metro(它也包含在WebLogic中)轻松设置它。这就是您找到使用WebLogic作为容器的解决方案的原因。)。更准确地说,您需要在类路径中添加两个jar。我建议
jaxb-api.jar
和jaxws-api.jar
添加到您的类路径中。例如,您可以将它们放入JAVA_HOME/lib/endorsed
或手动将它们添加到项目中来执行此操作。这在很大程度上取决于IDE或您正在使用的任何内容。完成此操作后,即使MyErrorHandler
部署Endpoint.publish()
,{{1}}也应有效。至少我在本地进行了这种设置,它可以编译并运行。
如果您无法修改类路径并需要验证,则必须使用JAXB手动验证请求。
答案 1 :(得分:2)
老问题,但我使用正确的包和最小配置解决了问题,并且仅使用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;
}
}