Перехват SOAP-запроса Enum для передачи пользователю сообщения, если тип запроса отличается от заданного в Enum
У нас есть веб-сервис SOAP, и наш подход - WSDL. Ниже вы видите объект запроса, сгенерированный из wsdl через wsdl к плагину java в pom.xml. Вот как выглядит объект запроса:
@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 IS ENUM. Теперь TypeOfRequest имеет 7 значений. Допустим, пользователь отправляет любое другое значение, отличное от 7 значений, определенных для него в TypeOfRequest, затем оно принимает значение NULL, и наша проверка не может проверить его, чтобы увидеть, действительно ли пользователь не выбрал какой-либо TypeOfRequest или дал какое-то другое значение, кроме 7 значений. ТАК в ореховой скорлупе я хочу проверить и отправить значимое сообщение, если пользователь выбрал любое другое значение, кроме значения 7. Я не могу этого достичь. Есть ли способ, которым я могу это сделать? У меня есть идея, что я могу ее перехватить, но мне нужно руководство для ее реализации. Мы используем cxf, jaxws и Spring Framework.
3 ответа
Благодарю. Мы используем SPring, но это не веб-приложение, а веб-сервис SOAP, поэтому нет контроллера. Во-вторых, если пользователь отправит другое значение для TYpeOfRequest, то есть Enum, тогда мы получим ноль. Я хочу поставить проверку, чтобы я мог проверить неправильное значение Enum.
Я был в состоянии решить это. Шаги, которые я сделал, были: 1) Создан пользовательский адаптер.
открытый класс RequestXXXXAdapter extends 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) защищенный ReqXXXX reqxxxx;
Так что теперь с этим изменением я могу проверить Enum еще до того, как мои сервисные запросы появятся.
Ваши теги подразумевают, что вы используете Spring; в этом случае вы можете посмотреть на весну проверки. Используя это, вы можете добавить аннотации, которые определяют экземпляры контрактов вашего класса: @NonNull
и т. д., а затем добавить @Valid
(или же @Validated
) в вашем методе контроллера, где вы вводите экземпляр.
public class XXXRequest {
// ...
protected @NonNull TypeOfRequest type;
// ...
}
И в контроллере:
@GetMapping("/{id}")
public ResponseEntity<?> get(final @Valid XXXRequest request) {
// ...
}