2016-10-11 11 views
1

У меня возникли проблемы с отправкой простого запроса SOAP и получением ответа внутри моего проекта java.Не удается подключиться к службе SOAP через Java и IntelliJ

Я до сих пор довольно новичок в этом, используя java, поэтому я смотрю на this учебник, так как я также использую весеннюю загрузку в остальной части моего проекта.

В настоящее время я получаю эту ошибку (мне пришлось удалить специфику из-за того, что она связана с компанией и заменила ее на общие строки, чтобы вставить их здесь. Мне пришлось удалить мой фактический wsdl и фактическое имя хоста):

[INFO] --- maven-jaxb2-plugin:0.12.3:generate (default) @ dcc-vm-validation --- 
[INFO] Up-to-date check for source resources [[myWsdl, file:pom.xml]] and taret resources [[]]. 
[WARNING] The URI [myWsdl] seems to represent an absolute HTTP or HTTPS URL. Getting the last modification timestamp is only possible if the URL is accessible and if the server returns the [Last-Modified] header correctly. This method is not reliable and is likely to fail. In this case the last modification timestamp will be assumed to be unknown. 
[ERROR] Could not retrieve the last modification timestamp for the URI [myWsdl] from the HTTP URL connection. The [Last-Modified] header was probably not set correctly. 
[WARNING] Last modification of the URI [myWsdl] is not known. 
[INFO] Sources are not up-to-date, XJC will be executed. 
[ERROR] Error while parsing schema(s).Location []. 
com.sun.istack.SAXParseException2; IOException thrown when processing "myWsdl". Exception: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching hostname found. 

Вот мой раздел «сборка» мой П:

<build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 

      <plugin> 
       <groupId>org.jvnet.jaxb2.maven2</groupId> 
       <artifactId>maven-jaxb2-plugin</artifactId> 
       <version>0.12.3</version> 

       <executions> 
        <execution> 
         <goals> 
          <goal>generate</goal> 
         </goals> 
        </execution> 
       </executions> 

       <configuration> 
        <schemaLanguage>WSDL</schemaLanguage> 
        <generatePackage>package.wsdl</generatePackage> 

        <schemas> 
         <schema> 
          <url>myWsdl</url> 
         </schema> 
        </schemas> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

После выполнения некоторых исследований о том, что означает, что эта конкретная ошибка, я был в состоянии загрузить самостоятельно подписанный сертификат от местоположения WSDL (через Chrome) на рабочий стол. Затем я использовал keytool для добавления этого конкретного сертификата в мой файл cacerts (я убедился, что псевдоним cert соответствует имени хоста в вышеприведенной ошибке). Насколько мне сказали, это устранит мои проблемы с подключением, но это не так. Я все еще вижу ту же ошибку, что и выше, говоря, что она не может найти мое имя хоста.

Что мне здесь не хватает?

В качестве альтернативы, я также прочитал об обходе сертификатов вообще. Это также подход, против которого я бы не стал возражать, поскольку этот проект, над которым я работаю, является ТОЛЬКО внутренним и будет находиться в интранете компании. Он не будет доступен никому, кроме сотрудников, поэтому риски безопасности могут быть проигнорированы. Я знаю, что это считается плохой практикой, но я уже читал риски и обсуждал это с моим боссом, и он в порядке, если мы идем по этому маршруту.

я смог найти этот небольшой фрагмент кода, который, кажется, чтобы сделать работу:

static { 
      javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() { 
       public boolean verify(String hostname, javax.net.ssl.SSLSession session) { 
        if (hostname.equals(myHostname)) { 
         return true; 
        } 

        return false; 
       } 
      }); 
     } 

, но во всех примерах, которые я нашел, что это ни разу не указано, куда его положить. Он просто сказал, что это то, что вам нужно игнорировать SSL и самозаверяющие ошибки сертификата. Где бы я поместил это в соответствие с моим кодом и есть ли конкретный способ сделать это, так как я пытаюсь сделать это через spring/jaxb?

Извините за длинную извилистую стену! Просто пытаюсь узнать что-то новое здесь :)

+0

Можете ли вы запросить ответ от другого клиента, например POSTMAN или SOAPUI или Boomerang? –

+0

Да. Я действительно могу отправить запрос и получить действительный ответ как с SoapUI, так и с Postman. Я попытался правильно отразить заголовки в java-коде, так как есть основная авторизация, которая также случается, но я не уверен, что я даже ударил эту часть, пока я получаю эту ошибку. – user1818298

+0

Вы правы, что не получаете доступ к основному auth (или другому протоколу HTTP). Псевдоним в доверенности не имеет значения; имеет значение имя хоста в URL (который вы отредактировали) и имя хоста в сертификате. Вы уже сделали локальную копию сертификата; посмотрите на него с помощью keytool -printcert и используйте либо Owner CN (CommonName), либо одно из имен (или, возможно, адресов) из SubjectAlternativeName, если они есть. НЕ меняйте имя домена на адрес или наоборот; во многих сетевых контекстах они эквивалентны, но не для HTTPS. –

ответ

0

Обычно я не рекомендую составлять абсолютные URL-адреса. Это делает сборки неустойчивыми и создает проблемы, подобные тем, которые вы страдаете.

Лучшее решение для загрузки и хранения связанных ресурсов локально в проекте и использования catalog files для перезаписи URL-адресов.

Я буду считать абсолютный URL-адрес, как http://www.my.org/wsdl/my.wsdl. Загрузите ресурсы от http://www.my.org и храните их под управлением src/main/resource/www.my.org.

Затем написать src/main/resources/catalog.cat файл как:

REWRITE_SYSTEM "http://www.my.org" "www.my.org" 

настроить его в плагине:

<configuration> 
    <catalog>src/main/resources/catalog.cat</catalog> 
    <schemaLanguage>WSDL</schemaLanguage> 
    <schemas> 
     <schema> 
      <url>http://www.my.org/wsdl/my.wsdl</url> 
     </schema> 
    </schemas> 
</configuration> 

XJC будет переписать http://www.my.org/wsdl/my.wsdl URL в src/main/resources/www.my.org/wsdl/my.wsdl.

Существует несколько предостережений, так как вы не сможете смешивать относительные и абсолютные URL-адреса, но в конце это намного стабильнее, чем полагаться на внешний ресурс в сборке. Вы действительно хотите, чтобы сборки были стабильными и повторяемыми. Подумайте, что произойдет, если кто-то обновит на сервере my.wsdl.

Отказ от ответственности: Я являюсь автором maven-jaxb2-plugin.