1

我有 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

我在互联网上找到的解决方案很少,所有这些都暗示使用WebLogic容器。在我的情况下,我不能使用容器,我需要嵌入式服务。我还能使用模式验证吗?

4

2 回答 2

4

@SchemaValidation注解未在 JAX-WS 规范中定义,但验证保持打开状态。这意味着您需要的不仅仅是 jdk 中的类。

只要您能够将一些 jars 添加到您的类路径中,您就可以使用 metro 轻松设置它(它也包含在 WebLogic 中。这就是您找到使用 WebLogic 作为容器的解决方案的原因。)。更准确地说,您需要在类路径中添加两个 jar。我建议

  1. 下载最新的地铁版本
  2. 在某处解压。
  3. jaxb-api.jar将and添加jaxws-api.jar到您的类路径中。例如,您可以通过将它们放入JAVA_HOME/lib/endorsed或手动将它们添加到您的项目中来做到这一点。这在很大程度上取决于 IDE 或您使用的任何东西。

完成此操作后,MyErrorHandler即使它是通过Endpoint.publish(). 至少我在本地有这个设置,它可以编译和工作。

如果您无法修改类路径并需要验证,则必须使用 JAXB 手动验证请求。

于 2013-02-04T13:53:48.017 回答
3

老问题,但我使用正确的包和最少的配置以及仅使用 WebLogic 提供的服务解决了这个问题。我遇到了和你一样的问题。

只需确保使用我在此处描述的正确 java 类型。

当我计划扩展到跟踪机制时,我还实现了自定义错误处理程序。

具有自定义验证处理程序的 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;
    }
}
于 2015-01-21T15:26:11.180 回答