|
|
|
Web-сервис Java, 1С-клиент: проблема передачи строкового параметра
|
|||
|---|---|---|---|
|
#18+
Проблема при передаче параметра строкового типа web-сервиса. Имеем: Со стороны web-сервиса - GlassFish 3.1.2 + NetBeans 7.3 + Java EE 6. Со стороны клиента web-сервиса - Платформа 1C Предприятие 8.2.18.61. Код web-сервиса: Код: 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. Код клиента (здесь 2 опробованных варианта - ни один не работает): Вариант 1 Код: vbnet 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. Вариант 2 Код: vbnet 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. Проблема: Собственно все вроде бы работает, никакие исключения не выскакивают, метод RequestsForRepairDownload.download(String nodeName) вызывается, НО web-сервис возвращает пустой список, когда должен возвращать заполненный некоторыми значениями. Включаем отладчик со стороны java ee и видимо, что значение параметра nodeName = null; Если тестировать web-сервис штатными средствами GlassFish через консоль администратора все работает ОК. Примечание: Предвижу предложение в 1С сделать так: Код: vbnet 1. Действительно, на некоторых форумах описана практика успешного решения проблемы подобным способом. Но в моем случае 1С выбрасывает исключение, сообщая, что методу download передан параметр неверного типа. Вопрос: Есть ли у кого опыт успешного решения подобной проблемы или хотя бы какие-то идеи куда копать? Есть подозрение, что собственно прикладной код и со стороны web-сервиса и со стороны клиента написан верно (во всяком случае по мануалам), однако видимо формат wdsl описания, которое генерирует GlassFish чем-то не очень нравится 1С. Во всяком случае в сети описания подобной проблемы есть (не применительно к JAVA EE Web-сервису, в плане херовости реализации клиентской части работы с web-сервисами в 1С в принципе), но там речь идет о полной невозможности работать через стандартный механизм web-сервисов 1С (1С не может прочитать wdsl описание), здесь же оно вроде работает, но есть нюанс. ^_^ Есть и предложение решения: через HTTPСоединение, но я пока не пробовал. Хотелось бы все таки заставить все работать так, как оно ДОЛЖНО работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 01:47 |
|
||
|
Web-сервис Java, 1С-клиент: проблема передачи строкового параметра
|
|||
|---|---|---|---|
|
#18+
Пока что попробовал обходной маневр - использовать ms soap toolkit 3 через COM. Результат оказался ещё хуже. Здесь ошибка выскакивает на самом начальном этапе при вызове метода MSSoapInit(): Код: java 1. 2. Что имеем: WSПрокси.faultstring = WSПрокси.faultstringWSDLOperation: The schema definition with a targetnamespace of http://exchange.services/ for SoapMapper download could not be found WSПрокси.detail = WSПрокси.detailWSDLReader:Analyzing the WSDL file failed HRESULT=0x80004005 - WSDLReader:Initialization of service failed HRESULT=0x80004005 - WSDLService:Initialization of the port for service RequestsForRepairDownload failed HRESULT=0x80004005 - WSDLPort:Analyzing the binding information for port RequestsForRepairDownloadPort failed HRESULT=0x80004005 - WSDLPort:An operation for port RequestsForRepairDownloadPort could not be initialized HRESULT=0x80004005 - WSDLOperation:Initializing of the input message failed for operation download HRESULT=0x80004005 - WSDLOperation:The parameters for element parameters in operation download could not be created. The parameters could not be expanded HRESULT=0x80004005 - WSDLOperation:The schema definition with a targetnamespace of http://exchange.services/ for SoapMapper download could not be found HRESULT=0x80004005 Из всего вышесказанного я могу предположить, что загвоздка видимо в wsdl файле. Возможно его как-то надо откорректировать, чтобы он стал более понятен 1С и MS SOAP Toolkit - непосредственно или как-то изменив какие-то настройки glassfish, изменив аннотации или ещё как-то. Думаю есть смысл выложить и сам wsdl файл: conversiontower:8080/RequestsForRepairDownload/RequestsForRepairDownload?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. conversiontower:8080/RequestsForRepairDownload/RequestsForRepairDownload?xsd=1 Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 15:55 |
|
||
|
Web-сервис Java, 1С-клиент: проблема передачи строкового параметра
|
|||
|---|---|---|---|
|
#18+
Проблема решена, тему можно закрывать! Напишу здесь в чем было дело и что помогло на случай, если кто столкнется с аналогичной проблемой. soapUI рулит! После создания проектов для теста клиента и сервиса все стало понятно. Исходя из изначально сгенерированного wsdl следовал следующий формат сообщений с параметром: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 1C же упорно слала сообщения следующего вида: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. Из этих двух сообщений видно, что изначально для тэга <nodename> пространство имен было пустое, 1С же включала этот тэг в пространство имен " http://exchange.services/". Решение было простым: добавить для тэга <nodename> пространство имен " http://exchange.services/"! Ничего сверхестественного делать не пришлось - все обошлось правкой аннотаций. Сразу оговорюсь, что подобная фигня была не только с передачей параметра, но и со всем остальным. В итоге метод download() приобрел следующий вид: Код: java 1. 2. 3. 4. 5. Как можно заметить в аннотациях @WebResult и @WebParam появилось targetNamespace = " http://exchange.services/". Похожие вещи пришлось проделать со всеми классами графа возвращаемых объектов: @XmlRootElement(name = "requestforrepair") превратился @XmlRootElement(name = "requestforrepair", namespace = " http://exchange.services/"), @XmlElement(name = "number") превратился в @XmlElement(name = "number", namespace = " http://exchange.services/") и т.д. После подобных махинаций все заработало нормально. Никаких HTTPСоединение и MS SOAP Toolkit не понадобилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2013, 23:55 |
|
||
|
Web-сервис Java, 1С-клиент: проблема передачи строкового параметра
|
|||
|---|---|---|---|
|
#18+
neural_cyst, есть способ по-проще: в пакете веб-сервиса, допустим это "ru.company.ws", создать файл package-info.java следующего содержания: Код: java 1. 2. 3. тогда WSDL приобрет вид : Код: xml 1. 2. 3. 4. Как видно, elementFormDefault стал равен "qualified". Теперь сервис будет производить ответ следующего вида: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. Такой вариант работы с неймспейсами на ура воспринимается 1С. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2014, 18:06 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=59&tid=2126561]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
165ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 474ms |

| 0 / 0 |
