Схема ответа SOAP

Сейчас я изучаю SOAP WS и создал очень простой класс, который я представляю как веб-службу.

@WebService
public class StudentWS {   
    @WebMethod
    public Student getStudent(){
      Student stud = new Student();
      stud.setId(99);
      stud.setFirstName("John");
      stud.setLastName("Doe");
      stud.setGpa(2.1);
      return stud;
    }
}

Когда я вызываю эту веб-службу, возвращаемый ответ SOAP следует этому формату.

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:getStudentResponse xmlns:ns2="http://annotation/">
         <return>
            <firstName>John</firstName>
            <gpa>2.1</gpa>
            <id>99</id>
            <lastName>Doe</lastName>
         </return>
      </ns2:getStudentResponse>
   </S:Body>
</S:Envelope>

Мой вопрос в том, есть ли способ повлиять на ответ SOAP, чтобы он следовал какой-то схеме, как показано ниже.

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:getStudentResponse xmlns:ns2="http://annotation/">
        <student gpa="2.1">
            <id>99</id>
            <name>
                <firstName></firstName>
                <lastName></lastName>
            </name>
        </student>
      </ns2:getStudentResponse>
   </S:Body>
</S:Envelope>

Мои данные поступают из класса POJO, подобного этому.

@XmlRootElement
public class Student {
    private int id;
    private String firstName;
    private String lastName;
    private double gpa;
    //getters and setters
}

Спасибо.


person Mark Estrada    schedule 25.04.2011    source источник


Ответы (2)


Я не знаю, решили ли вы уже это, но я недавно начал работать над WS и столкнулся с точно такой же проблемой. Я все равно решил это:

Вам нужно создать 2 класса Bean Bean 1.

public class ResultBean {

    private String id;
        private String student;
    private StudentName name = new StudentName ();

//corresponding getter setter methods
    ....
        ....
        ....
}

Фасоль 2.

public class StudentName {

    private String firstName;
    private String lastName;
//corresponding getter setter methods
    ....
        ....
}

и действуй как ты. Надеюсь, это решит вашу проблему.

person Shourjya    schedule 31.07.2011

Вам нужно создать два класса и использовать аннотацию @XmlAttribute, если вы хотите иметь gpa в качестве атрибута...

Аннотации в этом примере носят иллюстративный характер.

public class Student {

    @XmlAttribute
    private String gpa;

    @XmlElement
    private String id;

    @XmlElement
    private Name name;

}

public class Name {

    @XmlElement
    private String firstName;

    @XmlElement
    private String lastName;

}
person user219882    schedule 25.04.2012