如果请求类型与Enum中定义的不同,则拦截SOAP请求Enum参数以向用户发送消息

时间:2017-09-18 23:07:53

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

我们有SOAP webservice,我们的方法首先是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是ENUM。 现在TypeOfRequest有7个值。 让我们说User发送除了在TypeOfRequest中为它定义的7个值之外的任何其他值,然后它变为NULL并且我们的验证不能验证它以查看用户是否确实没有选择任何TypeOfRequest或给出除7个值之外的其他值。 因此,如果用户选择了除7值之外的任何其他值,我想要验证并发送有意义的消息。 我无法实现它。 有什么办法可以吗? 我有一个想法,我可以拦截它,但需要指导来实现它。 我们使用的是cxf,jaxws和Spring框架。

3 个答案:

答案 0 :(得分:0)

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

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

在控制器中:

@GetMapping("/{id}")
public ResponseEntity<?> get(final @Valid XXXRequest request) {
    // ...
}

答案 1 :(得分:0)

感谢。我们正在使用SPring,但它不是一个Web应用程序,它是SOAP webservice,所以没有控制器。第二件事是用户为TYpeOfRequest发送不同的值,即Enum,然后我们得到null。我想进行验证,以便我可以验证Enum的错误值。

答案 2 :(得分: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:使用ReqXXXX枚举在xsd中添加以下内容。

<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)     受保护的ReqXXXX reqxxxx;

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