Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Web-сервисы на eclipse / 14 сообщений из 14, страница 1 из 1
20.03.2013, 09:12:35
    #38190879
greg_123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Web-сервисы на eclipse
Добрый день!

Пишу небольшой web-сервис на java (eclipse, tomcat) - из java классов создаю wsdl. В ответ необходимо добавить обязательный тег.
Создаю новый класс, перечисляю переменные в определенном порядке, геттеры и сеттеры в том же порядке. При формировании wsdl порядок элементов внутри этого тега меняется - сортируются по алфавиту, и элементы, названные с большой буквы именуются теперь с маленькой. Как можно жестко задать порядок элементов внутри тега и чтобы элементы именовались с большой буквы?

Заранее спасибо.
...
Рейтинг: 0 / 0
20.03.2013, 09:31:12
    #38190907
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Web-сервисы на eclipse
Необходимо в класс добавить jaxb аннотации.
Например, чтобы задать порядок элементов, отличный от алфавитного, указываем propOrder, для чего перед названием класса помещаем аннотацию:
Код: java
1.
@XmlType(propOrder={"personId","email","phones","addresses"})



Чтобы задать название тега, помещаем соответствующую аннотацию перед полем/геттером:
Код: java
1.
2.
3.
4.
	@XmlElement(name="EMAIL")
	public Email getEmail() {
		return email;
	}
...
Рейтинг: 0 / 0
20.03.2013, 10:12:53
    #38190966
greg_123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Web-сервисы на eclipse
Для того чтобы заработал механизм аннотаций нужно ли еще что-либо?

Потому что добавил аннотации:
Код: java
1.
@XmlType(propOrder={"MessageTypeId","MessageDate","SenderId","RecipientId","OperationTypeId","RequestMessageId","RequestMessageIdRef","ResponseMessageId","ResponseCode","ResponseComment"})



и

Код: java
1.
@XmlElement(required = true, name="MessageTypeId")



в импорт добавились классы:
import javax.xml.bind.annotation.*;

Но ничего не изменилось?
...
Рейтинг: 0 / 0
20.03.2013, 10:35:12
    #38191007
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Web-сервисы на eclipse
в propOrder должны быть перечислены не результирующие элементы, а свойства вашего класса (property), какими они видны из reflections, то есть, скорее всего, с маленькой буквы.
А наименование элемента разве не поменялось?
Аннотации с названиями элементов стоят перед геттерами? (если перед полями, то тогда необходимо добавить перед классом аннотацию
Код: java
1.
@XmlAccessorType(XmlAccessType.FIELD)

, так как по умолчанию доступ к свойствам (XmlAccessType.PROPERTY)
...
Рейтинг: 0 / 0
20.03.2013, 13:49:51
    #38191362
greg_123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Web-сервисы на eclipse
Ничего, к сожалению, не изменилось. Может быть нужно еще какие-нибудь аннотации указывать?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
//@XmlType(propOrder={"messageTypeId","messageDate","senderId","recipientId","operationTypeId","requestMessageId","requestMessageIdRef","responseMessageId","responseCode","responseComment"})
@XmlType(propOrder={"MessageTypeId","MessageDate","SenderId","RecipientId","OperationTypeId","RequestMessageId","RequestMessageIdRef","ResponseMessageId","ResponseCode","ResponseComment"})
public class MessageInfoList {
	
	private String MessageTypeId = null;
	private Date MessageDate = null;
	private String SenderId = null;
	private String RecipientId = null;
	private String OperationTypeId = null;
	private String RequestMessageId = null;
	private String RequestMessageIdRef = null;
	private String ResponseMessageId = null;
	private String ResponseCode = null;
	private String ResponseComment = null;
	
	public MessageInfoList()
	{
		setMessageInfo("0");
	}
	
	public MessageInfoList(String ownerID)
	{	
		if (ownerID.trim().equalsIgnoreCase("")) 
			setMessageInfo("0");
		else
			setMessageInfo(ownerID);
	}

	private void setMessageInfo(String ownerID)
	{

	}

	@XmlElement(required = true, name="MessageTypeId")
	public String getMessageTypeId() {
		return MessageTypeId;
	}

	public void setMessageTypeId(String messageTypeId) {
		MessageTypeId = messageTypeId;
	}
	@XmlElement(required = true, name="MessageDate")
	public Date getMessageDate() {
		return MessageDate;
	}

	public void setMessageDate(Date messageDate) {
		MessageDate = messageDate;
	}
	@XmlElement(required = true, name="SenderId")
	public String getSenderId() {
		return SenderId;
	}

	public void setSenderId(String senderId) {
		SenderId = senderId;
	}
	@XmlElement(required = true, name="RecipientId")
	public String getRecipientId() {
		return RecipientId;
	}

	public void setRecipientId(String recipientId) {
		RecipientId = recipientId;
	}
	@XmlElement(required = true, name="OperationTypeId")
	public String getOperationTypeId() {
		return OperationTypeId;
	}

	public void setOperationTypeId(String operationTypeId) {
		OperationTypeId = operationTypeId;
	}
	@XmlElement(required = true, name="RequestMessageId")
	public String getRequestMessageId() {
		return RequestMessageId;
	}

	public void setRequestMessageId(String requestMessageId) {
		RequestMessageId = requestMessageId;
	}
	@XmlElement(required = true, name="RequestMessageIdRef")
	public String getRequestMessageIdRef() {
		return RequestMessageIdRef;
	}

	public void setRequestMessageIdRef(String requestMessageIdRef) {
		RequestMessageIdRef = requestMessageIdRef;
	}
	@XmlElement(required = true, name="ResponseMessageId")
	public String getResponseMessageId() {
		return ResponseMessageId;
	}

	public void setResponseMessageId(String responseMessageId) {
		ResponseMessageId = responseMessageId;
	}
	@XmlElement(required = true, name="ResponseCode")
	public String getResponseCode() {
		return ResponseCode;
	}

	public void setResponseCode(String responseCode) {
		ResponseCode = responseCode;
	}
	@XmlElement(required = true, name="ResponseComment")
	public String getResponseComment() {
		return ResponseComment;
	}

	public void setResponseComment(String responseComment) {
		ResponseComment = responseComment;
	}


}
...
Рейтинг: 0 / 0
20.03.2013, 14:17:22
    #38191423
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Web-сервисы на eclipse
Указано
Код: java
1.
@XmlAccessorType(XmlAccessType.FIELD)

, а аннотации стоят перед геттерами. Если указано XmlAccessType.FIELD, то аннотации с названиями элементов должны стоять перед полями
...
Рейтинг: 0 / 0
20.03.2013, 14:52:05
    #38191484
greg_123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Web-сервисы на eclipse
Да я уже и так и так пробовал:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
        @XmlElement(required = true, name="MessageTypeId")
	private String MessageTypeId = null;
	@XmlElement(required = true, name="MessageDate")
	private Date MessageDate = null;
	@XmlElement(required = true, name="SenderId")
	private String SenderId = null;
	@XmlElement(required = true, name="RecipientId")
	private String RecipientId = null;
	@XmlElement(required = true, name="OperationTypeId")
	private String OperationTypeId = null;
	@XmlElement(required = true, name="RequestMessageId")
	private String RequestMessageId = null;
	@XmlElement(required = true, name="RequestMessageIdRef")
	private String RequestMessageIdRef = null;
	@XmlElement(required = true, name="ResponseMessageId")
	private String ResponseMessageId = null;
	@XmlElement(required = true, name="ResponseCode")
	private String ResponseCode = null;
	@XmlElement(required = true, name="ResponseComment")
	private String ResponseComment = null;



Такое ощущение, что eclipse просто не воспринимает аннотации. Может есть какая-либо настройка для их использования?
...
Рейтинг: 0 / 0
20.03.2013, 15:16:30
    #38191537
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Web-сервисы на eclipse
Если ничего не получается, остается создать XSD для вашего класса, и провести reverse engineering, там все аннотации и поля будут прописаны как надо. Процессор находится в папке jdk/bin. В простейшем случае команда должна выглядеть так:
Код: powershell
1.
"путь_к_jdk/bin/xjc" ваш_xsd.xsd


в текущем каталоге будет создан файл "ваш_класс.java"
...
Рейтинг: 0 / 0
21.03.2013, 12:59:17
    #38192992
greg_123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Web-сервисы на eclipse
С помощью "путь_к_jdk/bin/xjc" ваш_xsd.xsd создался класс. От туда взял аннотации:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "MessageInfoType", propOrder = {
    "messageTypeId",
    "messageDate",
    "senderId",
    "recipientId",
    "operationTypeId",
    "requestMessageId",
    "requestMessageIdRef",
    "responseMessageId",
    "responseCode",
    "responseComment"
})
public class MessageInfoList {
	
	@XmlElement(name = "MessageTypeId", required = true)
    protected String messageTypeId;
    @XmlElement(name = "MessageDate", required = true)
    @XmlSchemaType(name = "dateTime")
    protected Date messageDate;
    @XmlElement(name = "SenderId", required = true)
    protected String senderId;
    @XmlElement(name = "RecipientId", required = true)
    protected String recipientId;
    @XmlElement(name = "OperationTypeId", required = true)
    protected String operationTypeId;
    @XmlElement(name = "RequestMessageId", required = true)
    protected String requestMessageId;
    @XmlElement(name = "RequestMessageIdRef")
    protected String requestMessageIdRef;
    @XmlElement(name = "ResponseMessageId")
    protected String responseMessageId;
    @XmlElement(name = "ResponseCode")
    protected String responseCode;
    @XmlElement(name = "ResponseComment")
    protected String responseComment;
...



Но при создании wsdl эти аннотации похоже игнорируются :(
...
Рейтинг: 0 / 0
21.03.2013, 14:02:12
    #38193190
greg_123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Web-сервисы на eclipse
Прошу прощения, не правильно указал "name".
Должно быть так:
Код: java
1.
@XmlType(name = "MessageInfoList", propOrder = {



Но результат тот же - не работает.
...
Рейтинг: 0 / 0
23.03.2013, 22:28:05
    #38196126
greg_123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Web-сервисы на eclipse
Установил eclipse juno и tomcat 7.
Сделал пробный проект web-сервиса:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
package ru.test.hello;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlAccessorType;


@WebService
public class Hello {
	
	@WebMethod
	public MyStr getHello(String s)
	{
		MyStr res = new MyStr(s);
		return res;
	}
	


}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
package ru.test.hello;

import java.util.Date;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;

@XmlAccessorType(XmlAccessType.FIELD)
public class MyStr {
	@XmlElement(required = true, name="S1")
	protected String s;
	@XmlElement(required = true, name="D1")
	protected Date d;

	public MyStr(){
		
	}
	
	public MyStr(String str){
		
		//s = "Hello " + str + " !!!";
		//d = java.util.Calendar.getInstance().getTime();
		setS("Hello " + str + " !!!");
		setD(java.util.Calendar.getInstance().getTime());
		
	}

	public String getS() {
		return s;
	}

	public void setS(String s) {
		this.s = s;
	}

	public Date getD() {
		return d;
	}

	public void setD(Date d) {
		this.d = d;
	}
	
}



Получил wsdl:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://hello.test.ru" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://hello.test.ru" xmlns:intf="http://hello.test.ru" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->
 <wsdl:types>
  <schema elementFormDefault="qualified" targetNamespace="http://hello.test.ru" xmlns="http://www.w3.org/2001/XMLSchema">
   <element name="getHello">
    <complexType>
     <sequence>
      <element name="s" type="xsd:string"/>
     </sequence>
    </complexType>
   </element>
   <element name="getHelloResponse">
    <complexType>
     <sequence>
      <element name="getHelloReturn" type="impl:MyStr"/>
     </sequence>
    </complexType>
   </element>
   <complexType name="MyStr">
    <sequence>
     <element name="d" nillable="true" type="xsd:dateTime"/>
     <element name="s" nillable="true" type="xsd:string"/>
    </sequence>
   </complexType>
  </schema>
 </wsdl:types>

   <wsdl:message name="getHelloRequest">

      <wsdl:part element="impl:getHello" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:message name="getHelloResponse">

      <wsdl:part element="impl:getHelloResponse" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:portType name="Hello">

      <wsdl:operation name="getHello">

         <wsdl:input message="impl:getHelloRequest" name="getHelloRequest">

       </wsdl:input>

         <wsdl:output message="impl:getHelloResponse" name="getHelloResponse">

       </wsdl:output>

      </wsdl:operation>

   </wsdl:portType>

   <wsdl:binding name="HelloSoapBinding" type="impl:Hello">

      <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

      <wsdl:operation name="getHello">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="getHelloRequest">

            <wsdlsoap:body use="literal"/>

         </wsdl:input>

         <wsdl:output name="getHelloResponse">

            <wsdlsoap:body use="literal"/>

         </wsdl:output>

      </wsdl:operation>

   </wsdl:binding>

   <wsdl:service name="HelloService">

      <wsdl:port binding="impl:HelloSoapBinding" name="Hello">

         <wsdlsoap:address location="http://localhost/Hello/services/Hello"/>

      </wsdl:port>

   </wsdl:service>

</wsdl:definitions>



Но аннотация @XmlElement так и небыла использована, т.е. элементы тега MyStr так и остались с маленьком буквы.
Почему аннотации не используются? Может кто-нибудь сталкивался с такой проблемой?

Заранее спасибо.
...
Рейтинг: 0 / 0
25.03.2013, 09:06:10
    #38196833
greg_123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Web-сервисы на eclipse
Может быть необходимо установить JAXB?
Только непонятно что именно нужно установить для eclipse?
...
Рейтинг: 0 / 0
26.03.2013, 10:43:58
    #38198294
greg_123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Web-сервисы на eclipse
Попробовал создать wsdl по тем же двум классам из проекта на weblogic.
Результат
wsdl:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.6hudson-86  svn-revision#12773. -->
<definitions targetNamespace="http://hello.test.ru/" name="HelloService" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:tns="http://hello.test.ru/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://hello.test.ru/" schemaLocation="HelloService_schema1.xsd"/>
    </xsd:schema>
  </types>
  <message name="getHello">
    <part name="parameters" element="tns:getHello"/>
  </message>
  <message name="getHelloResponse">
    <part name="parameters" element="tns:getHelloResponse"/>
  </message>
  <portType name="Hello">
    <operation name="getHello">
      <input wsam:Action="http://hello.test.ru/Hello/getHelloRequest" message="tns:getHello"/>
      <output wsam:Action="http://hello.test.ru/Hello/getHelloResponse" message="tns:getHelloResponse"/>
    </operation>
  </portType>
  <binding name="HelloPortBinding" type="tns:Hello">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <operation name="getHello">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
  <service name="HelloService">
    <port name="HelloPort" binding="tns:HelloPortBinding">
      <soap:address location="REPLACE_WITH_ACTUAL_URL"/>
    </port>
  </service>
</definitions>


и xsd:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:ns0="http://hello.test.ru/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://hello.test.ru/">
   <xsd:complexType name="myStr">
      <xsd:sequence>
         <xsd:element name="S1" type="xsd:string"/>
         <xsd:element name="D1" type="xsd:dateTime"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="getHelloResponse">
      <xsd:sequence>
         <xsd:element name="return" type="ns0:myStr" minOccurs="0"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="getHello">
      <xsd:sequence>
         <xsd:element name="arg0" type="xsd:string" minOccurs="0"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:element name="getHelloResponse" type="ns0:getHelloResponse"/>
   <xsd:element name="getHello" type="ns0:getHello"/>
</xsd:schema>



Возвращаемые значения теперь стали называться как в аннотациях. Но входное значение теперь называется arg0.
Почему так по-разному формируются wsdl из одних и тех же классов?
И как же можно использовать аннотации в проекте на tomcat?
...
Рейтинг: 0 / 0
26.03.2013, 12:56:23
    #38198493
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Web-сервисы на eclipse
Я не знаток томката, в основном на jboss-е, и там сервисы генерятся нормально. Возможно, ответ заключен в схеме, сгенерированной томкатом:
Код: xml
1.
2.
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->


- используется что-то сильно устаревшее.
JAXB 2.0, аннтотации которого используются для описания названий элементов и т.п., выпущен тоже в 2006 году, но где-то летом, так что скорее всего, этот томкат его не использует. Так что аннотации тут не помогут, надо как-то "навязать" серверу xsd схему
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Web-сервисы на eclipse / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]