Перехват 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) {
    // ...
}
Другие вопросы по тегам