【问题标题】:Validating web service request against XSD in jax-ws?在 jax-ws 中针对 XSD 验证 Web 服务请求?
【发布时间】:2013-11-06 10:31:26
【问题描述】:

我正在使用jax-ws 开发基于肥皂的网络服务。我有以下端点,它有一个如下的网络方法。

@WebService
public interface MySoapService {

    @WebMethod
    public List<Result> getResult(TestRequest request);
}

在上面的 web 方法中,TestRequest 是使用 JAXB 从我的 XSD 生成的。我的问题是,当这个 web 服务被公开并且将 JAXB 生成的对象作为输入时,我是否需要针对 XSD 执行任何验证

如果我的方法将 XML 字符串作为输入,那么我可以针对 XSD 进行验证。但是这里我有一个 webmethod,它直接将 JAXB 对象作为输入。在这种情况下,针对 XSD 验证输入是谁的责任。

另外,请建议我使用 JAX-WS,我的 Web 方法将 JAXB 生成的对象作为输入,而不是 XML 字符串。 那么哪个是标准的呢?将 xml 字符串作为输入或从 XSD 生成的 JAXB 对象 ?我可以直接编写一个接受 JAXB 生成对象的 Web 方法吗?

谢谢!

【问题讨论】:

    标签: java spring web-services jaxb jax-ws


    【解决方案1】:

    默认情况下,JAX-WS 不对传入请求执行模式验证。您可以通过将@SchemaValidation 添加到您的服务来启用它。

    但是,在回答您的结束问题时,您的方法绝对应该接受 JAXB 生成的对象作为参数。接受 XML 作为字符串是一个非常个坏主意,因为它表明它没有被验证或解析。使用 JAX-WS、Spring-WS 等的全部目的是避免自己弄乱 XML。这些库非常适合您。

    从这里开始,通常不需要打开架构验证。这是因为 JAX-WS 将尝试使用 JAXB 编组器生成参数。如果它不能从它接收到的 XML 字符串中生成这些对象,那么它们显然是无效的,它会抛出异常。

    tl;dr - 是的,您可以验证架构,但可能不值得这样做。

    【讨论】:

    • 史蒂夫,非常感谢您的回复。如果我的 web 服务在没有 @SchemaValidation 的情况下接受 jaxb 对象,那么如果任何客户端调用我的不符合 xsd 的 web 服务,那么他们不会收到 BAD REQUEST 异常吗?谢谢!
    • 我不确定,但我希望如此。向 Web 服务发送无效请求对象应该会导致 400 BAD REQUEST。无论是否打开验证,这都应该是相同的。
    • 非常感谢史蒂夫。如果你得到,请给我一些想法。
    • 只需尝试在您的服务中发送一些结构不良的 XML,看看会发生什么。 :)
    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多