0

我们有 SOAP Web 服务,我们的方法首先是 WSDL。下面您会看到从 wsdl 通过 wsdl 生成的请求对象到 pom.xml 中的 java 插件。这是请求对象的样子:

@XmlRootElement(name = "XXXRequest") 公共类 GetXXXRequest {

@XmlElement(name = "XXX", required = true)
@XmlJavaTypeAdapter(XX .class)
protected String x;
@XmlElement(name = "YYY", required = true)
@XmlJavaTypeAdapter(XX .class)
protected String y;
@XmlElement(name = "ZZZ", required = true)
@XmlJavaTypeAdapter(XX .class)
protected String z;
@XmlElement(name = "TTT", required = true)
@XmlJavaTypeAdapter(XX.class)
protected String t;
@XmlElement(name = "TypeOfRequest", required = true)
protected TypeOfRequest type;
@XmlElement(name = "Criteria", required = true)
protected Criteria criteria;

TypeOfRequest 是枚举。现在 TypeOfRequest 有 7 个值。让我们说用户发送除了在 TypeOfRequest 中为其定义的 7 个值之外的任何其他值,然后它作为 NULL 出现,我们的验证无法验证它是否用户真的没有选择任何 TypeOfRequest 或提供了其他值而不是 7 个值。所以简而言之,如果用户选择了 7 值以外的任何其他值,我想验证并发送有意义的消息。我无法实现它。有什么办法可以做到吗?我有一个想法,我可以拦截它,但需要指导来实施它。我们正在使用 cxf 、 jaxws 和 Spring 框架。

4

3 回答 3

0

您的标签暗示您正在使用 Spring;在这种情况下,您可能需要查看spring 验证。使用它,您可以添加注释,指定您的类的合同实例应该支持:@NonNull等,然后在您注入实例的控制器方法中添加@Valid(或)。@Validated

public class XXXRequest {
    // ...
    protected @NonNull TypeOfRequest type;
    // ...
}

在控制器中:

@GetMapping("/{id}")
public ResponseEntity<?> get(final @Valid XXXRequest request) {
    // ...
}
于 2017-09-18T23:20:06.747 回答
0

谢谢。我们使用的是 SPring,但它不是一个网络应用程序,它是 SOAP 网络服务,所以没有控制器。第二件事是,如果用户为 TYPEOfRequest 发送不同的值,即 Enum,那么我们会得到 null。我想进行验证,以便我可以验证 Enum 的错误值。

于 2017-09-19T03:47:09.557 回答
0

我能够解决它。我所做的步骤是:1)创建了一个自定义适配器。

公共类 RequestXXXXAdapter 扩展 XmlAdapter{

@Override
public ReqXXXX unmarshal(String v) throws Exception {
    try {
        return ReqXXX.valueOf(v);
    } catch(Exception e) {
        throw new JAXBException("Invalid parameter");
    }
}

@Override
public String marshal(ReqXXXX type) throws Exception {
    return type.name();
}

}

第 2 步:在 xsd 中添加下面的 ReqXXXX 枚举。

<xs:annotation>
   <xs:appinfo>
    <xjc:javaType name="com.XX.XX.XX.ReqXXXX"
      adapter="com.xx.xx..yy.ReqXXXAdapter" /> 
   </xs:appinfo>
</xs:annotation>

... ..

所以上面的代码生成了注解 XmlJavaTypeAdapter @XmlJavaTypeAdapter(ReqTXXXXAdapter.class) protected ReqXXXX reqxxxx;

所以现在有了这个改变,我甚至可以在我的 serviceimpl 命中之前验证 Enum。

于 2017-09-21T17:28:53.327 回答