我们有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框架。
答案 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。