보이기/숨기기 가능합니다^^
hermeswing log (282)
Core Java (22)
JSP/JavaScript/HTML (33)
Jakarta Source (5)
Framework (40)
Build (5)
Database (46)
Server (11)
형상관리 (7)
Big Data (0)
Exception (33)
장난감들 (43)
문서 (29)
기타 (8)
보이기/숨기기 가능합니다^^
How to resolve NoSuchMethodError: javax.wsdl.xml.WSDLReader.readWSDL(Ljavax/wsdl/xml/WSDLLocator)
Exception | 2017. 1. 16. 10:27


How to resolve NoSuchMethodError: javax.wsdl.xml.WSDLReader.readWSDL(Ljavax/wsdl/xml/WSDLLocator)



SOAP 개발 시 오류가 발생했습니다.

뭐.. 어떻게 하고 자시고가 없네요.

자동 Generator 된 소스라.. 뭐라 잘못 된건지... ㅠ.ㅠ


한참 구글링하던 중 라이브러리를 update 하면 된다라는 힌트를 얻었습니다.. +_+


Server에서 사용된 wsdl4j-1.6.2.jar 과

Client에서 사용된 wsdl4j-1.5.x.jar 과의 버젼 차이에서 발생하는 내용일 수 있더군요..


덕분에 해결됐습니다.


그런데.. 이 내용은 axis 에서도 같은 현상이 발생할 수 있는 것 같네요~




참고 : http://toptechnologist.com/resolving-java-lang-nosuchmethoderror-javax-wsdl-xml-wsdlreader-readwsdlljavaxwsdlxmlwsdllocatorlorgw3cdomelement/





Trackbacks 0 : Comments 0
위로
[Exception] IWAB0014E Unexpected exception occurred.
Exception | 2016. 8. 27. 15:48

개발환경

cxf-2.6.8

spring-


시나리오.

Web Service Service Generation 중 오류 발생.




여러가지 이유가 있겠지만..   사실 정확한 원인을 아직도 모르겠어요..


첫번째. 


기존 생성된 폴더를 overwrite 하지 못하는 듯 하다.

생성되어 있는 .cxftmp,  wsdl 폴더를 삭제한다.

cxf-beans.xml 파일 삭제


두번째. 환경설정





세번째. 버젼 차이.

Eclipse 의 Web Service 를 사용해서 wsdl 파일 및 bean-xml 생성 시 Eclipse 의 plugin 오류가 있는 듯 보입니다.

버젼에 따라 정상 동작하기도 합니다.


저의 cxf-2.7.18의 경우 

wsdl 파일 및 xml 생성은 잘 되는데...

Client 에서 접속 실패했습니다.


그런데...

cxf-2.3.11 의 경우

2.7.18 에서 생성된 wsdl 을 이용해서 Client를 띄웠는데..

성공했습니다.










Trackbacks 359 : Comments 0
위로
[Exception] java.lang.AssertionError: org.xml.sax.SAXParseException; systemId: jar:file:/C:/apache/cxf-2.7.18/lib/jaxb-xjc-2.2.6.jar!/com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd;
Exception | 2016. 8. 26. 10:27


개발환경

cxf 2.7.18


시나리오.

cxf 2.7.18을 이용해서 SOAP 을 이용한 Web Service 환경을 구축하는게 목표입니다.

Server는 정상적으로 동작합니다.

Server에서 생성된 wsdl 파일에 의해 Client Source를 생성하기 위해 wsdl2java를 사용하기로 했습니다.


소스 생성 중 아래와 같은 오류가 발생했습니다.


Exception in thread "main" java.lang.AssertionError: org.xml.sax.SAXParseException; systemId: jar:file:/C:/apache/cxf-2.7.18/lib/jaxb-xjc-2.2.6.jar!/com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd; lineNumber: 52; columnNumber: 88; schema_reference: accessExternalSchema �Ӽ����� ������ �������� ���� 'file' �׼����� ������ �����Ƿ� ��Ű�� ���� 'xjc.xsd' �б⸦ �����߽��ϴ�. 



출처 : http://webkebi.zany.kr:9003/board/bView.asp?bCode=52299899&aCode=13368


관련링크01
http://stackoverflow.com/questions/23011547/webservice-client-generation-error-with-jdk8 

관련링크02

http://cxf.apache.org/docs/wsdl-to-java.html 
------------------------------------------------------------------------------
Webservice client generation error...
http://stackoverflow.com/questions/23011547/webservice-client-generation-error-with-jdk8
------------------------------------------------------------------------------


$ wsdl2java \
-verbose -client -defaultValues \
-impl -validate \
-encoding UTF-8 \
-fe jaxws21 \
-p stub \
-wsdlLocation http://localhost:8080/services/contentStoreCxf?wsdl \
contentStore.wsdl


- 한글...
Exception in thread "main" java.lang.AssertionError: org.xml.sax.SAXParseException;
systemId: jar:file:/Zany/DevTools/apache-cxf-2.7.18/lib/jaxb-xjc-2.2.6.jar!/com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd;
lineNumber: 52; columnNumber: 88; schema_reference:
accessExternalSchema 속성으로 설정된 제한으로 인해 'file' 액세스가 허용되지 않으므로 스키마 문서 'xjc.xsd' 읽기를
실패했습니다.

Caused by: org.xml.sax.SAXParseException;
systemId: jar:file:/Zany/DevTools/apache-cxf-2.7.18/lib/jaxb-xjc-2.2.6.jar!/com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd;
lineNumber: 52; columnNumber: 88; schema_reference:
accessExternalSchema 속성으로 설정된 제한으로 인해 'file' 액세스가 허용되지 않으므로 스키마 문서 'xjc.xsd' 읽기를
실패했습니다.



- 영문...
java.lang.AssertionError: org.xml.sax.SAXParseException;
systemId: jar:file:/path/to/glassfish/modules/jaxb-osgi.jar!/com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd;
lineNumber: 52; columnNumber: 88; schema_reference:
Failed to read schema document 'xjc.xsd', because 'file' access is not allowed due to restriction
set by the accessExternalSchema property.


- JDK 8
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)



외부 스키마 엑세스 권한이 없어서 발생하는 문제로, 링크된 stackoverflow 와 Oracle JDK javax.xml.XMLConstants 공식
문서에 따르면, $JAVA_HOME/lib/jaxp.properties 파일에(없으면 만들어서) javax.xml.accessExternalSchema = all
과 같이 명시해주면 된다고 함.

실제로 해당 properties 파일을 만들어서 생성해보니 문제없이 생성됨.
$JAVA_HOME/lib/jaxp.properties 에 넣어서 안되면,
$JAVA_HOME/jre/lib/jaxp.properties 로 만들면 됨...



사실 Eclipse를 이용해서 작업을 하다 발생한 오류인지라..

아직 해결이 안되네요..


command 창에서 실행 했을 때는 되느군요...








Trackbacks 93 : Comments 0
위로
Spring Security on REST API 구축 실패기...!!!
Framework | 2016. 8. 24. 22:10

개발환경.

ajax + RESTful + Spring Security


시나리오.

RESTful API 환경 구축.

oAuth를 생각해 봤지만, 갑자기 눈에 들어온 것이 Spring Security... 시련의 시작...


1. 시작


그림, 소스 출처 : Spring Security on REST


수많은 검색 끝에 찾아낸 결론이였습니다.

소스도 있고 결과만 확인 하면 됐습니다. ( 뭐.. 항상 그렇지만 쉽지만은 않습니다. )


여차저차해서 전체적으로 약간의 수정으로 테스트가 이뤄졌습니다.

( restServicesEntryPoint 를 추가해 넣었습니다. )


<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:sec="http://www.springframework.org/schema/security"

    xsi:schemaLocation="

      http://www.springframework.org/schema/security

      http://www.springframework.org/schema/security/spring-security-3.2.xsd

      http://www.springframework.org/schema/beans

      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">


    <!-- Rest authentication entry point configuration -->

    <http use-expressions="true" entry-point-ref="restServicesEntryPoint">

        <intercept-url pattern="/api/**" />

        <sec:form-login username-parameter="username"

                    password-parameter="password"  

                    authentication-success-handler-ref="mySuccessHandler" 

                    authentication-failure-handler-ref="myFailureHandler" />

        <logout />

    </http>

   



    <!-- 인증 entry point 설정 - 인증 실패 시 401 Return -->

    <beans:bean id="restServicesEntryPoint" class="rest.api.security.RestAuthenticationEntryPoint" />

    

    <!-- Connect the custom authentication success handler -->

    <beans:bean id="mySuccessHandler" class="rest.api.security.RestAuthenticationSuccessHandler" />

    

    <!-- Using default failure handler     -->

    <beans:bean id="myFailureHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler" />


    <!-- Authentication manager -->

    <authentication-manager alias="authenticationManager">

        <authentication-provider>

            <user-service>

                <user name="temporary" password="temporary" authorities="ROLE_ADMIN" />

                <user name="user" password="userPass" authorities="ROLE_USER" />

            </user-service>

        </authentication-provider>

    </authentication-manager>


    <!-- Enable the annotations for defining the secure role -->

    <global-method-security secured-annotations="enabled" />


</beans:beans>



HttpClient를 이용해서 POST 방식으로 인증하고, 그 인증된 권한으로 실제요청을 하는 시나리오는 성공했습니다.



public static void test01() throws Exception {

CloseableHttpClient client = HttpClients.createDefault();


HttpPost httpPost = new HttpPost(loginUrl);

Map<String, String> parameterMap = new HashMap<String, String>();

parameterMap.put("username", "temporary");

parameterMap.put("password", "temporary");

UrlEncodedFormEntity postEntity = new UrlEncodedFormEntity(getParam(parameterMap), "UTF-8");

httpPost.setEntity(postEntity);

//System.out.println("request line:" + httpPost.getRequestLine());

try {

HttpResponse httpResponse = client.execute(httpPost);


//status:HTTP/1.1 401 Unauthorized

System.out.println("Status :: " + httpResponse.getStatusLine());

printResponse(httpResponse);


System.out.println("----the same client");

HttpGet httpGet = new HttpGet(testUrl);

System.out.println("request line:" + httpGet.getRequestLine());

HttpResponse httpResponse1 = client.execute(httpGet);

printResponse(httpResponse1);



} catch (IOException e) {

e.printStackTrace();

} finally {

try {

client.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}




request line:http://localhost:8080/j_spring_security_check HTTP/1.1

status:HTTP/1.1 200 OK

headers:

Server: Apache-Coyote/1.1

Set-Cookie: JSESSIONID=AE5211F53CB844576E8171A4D86422C3; Path=/; HttpOnly

Content-Type: text/html;charset=utf-8

Transfer-Encoding: chunked

Vary: Accept-Encoding

Date: Wed, 24 Aug 2016 11:32:35 GMT

response length:0

response content: 

----the same client

request line:POST http://localhost:8080/api/employees HTTP/1.1

status:HTTP/1.1 200 OK

headers:

Server: Apache-Coyote/1.1

Cache-Control: no-cache

Content-Type: application/json;charset=UTF-8

Content-Language: ko

Transfer-Encoding: chunked

Vary: Accept-Encoding

Date: Wed, 24 Aug 2016 11:32:35 GMT

response length:1084

response content:[{"MASTER_ID":"","ZIP_CODE":"1111","BIRTHDAY":"","ID":"CUST001","ADDR_TYPE":"","ADDR2":"주소2","ADDR1":"서울시 마포구","EMAIL":"hong@test.com","CUST_BIGO":"","NAME":"홍길동","MOBILE":"010111111111","TEL":"0211111111"},{"MASTER_ID":"","ZIP_CODE":"2222","BIRTHDAY":"","ID":"CUST002","ADDR_TYPE":"","ADDR2":"주소2","ADDR1":"주소1","EMAIL":"hong@test.com","CUST_BIGO":"","NAME":"허균","MOBILE":"01022222222","TEL":"0222222222"}]



뭐... 글쓰신 분도 curl 로 테스트 하셨을 때는 잘 된다. 하시던군요..

맞습니다. 잘 됩니다...

그런데...

ajax 로 하면 안됩니다. ㅡㅡ;;


처음엔 CORS 오류가 저를 괴롭혔습니다. 그래서 여차저차해서 몇일을 고생해서 해결했습니다. ( 참조 : [CORS] javascript ajax 크로스 도메인 요청 하기 )



authRequest("http://localhost:8080/j_spring_security_check", {

"username" : "temporary",

"password" : "temporary"

    }, function(xhr, statusText) {

console.log("인증 결과 :: " + statusText);

console.log("인증 status :: " + xhr.status);


//if(xhr.status == 200) {

if(xhr.status == 0) {

ajaxRequest("http://localhost:8080/api/employees", {

               "param", "param"

        });

    }

});


function authRequest(baseurl, params, onSuccess)

{


  $.ajax({

      url : baseurl

    , async : true

    , type : "POST"

    , cache:false

    , timeout : 30000 

    , data : JSON.parse(JSON.stringify(params))

    , dataType : "json"

    , crossDomain: true

    , xhrFields: {

         withCredentials: true

      }

    , beforeSend: function (xhr) {

    xhr.setRequestHeader("Accept", "application/json");

      }

    , complete : function (xhr, statusText) {

    onSuccess(xhr, statusText)

      }

    , error: function(xhr, statusText, errorThrown) {

        console.log("xhr :: " + xhr.status);

        console.log("statusText :: " + statusText);

        console.log("errorThrown :: " + errorThrown);

      }

  });

}


function ajaxRequest(baseurl, params)

{

$.ajax({

      url : "http://localhost:8080/api/employees"

    , async : true

    , type : "POST"

    , cache:false

    , timeout : 30000 

    , data : JSON.parse(JSON.stringify(params))

    , dataType : "json"

    , xhrFields: {

            withCredentials: true

      }

    , beforeSend: function (xhr) {

        xhr.setRequestHeader("Accept", "application/json");

      }

    , success : function (data, statusText, xhr) { 

        console.log("success status :: " + xhr.status + " || statusText :: " + statusText);

      }

    , error : function (xhr, statusText, errorThrown) { 

        console.log("error status :: " + xhr.status + " || statusText :: " + xhr.responseText + " || errorThrown :: " + errorThrown);

      }

  });

}


테스트 때 걸렸던 내용..


1. withCredentials: true 를 사용한 이유...

jsessionid를 같이 사용하기 위해 사용했습니다.

한 트랜잭션 안에서 실행이 되어야 할 듯 합니다.

왜냐하면 권한을 인증하고, 그 인증된 결과를 가지고 다시 실제요청을 해야합니다. ( 달리 방법을 찾지 못했습니다. 방법이 있을까요..? )


2. CORS

Filter를 적용해서 해결했습니다. ( 공부좀 했져.. ^^;; )

XMLHttpRequest cannot load http://localhost:8080/accnt/api/employees. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:7070' is therefore not allowed access.


ajax를 이용해서 인증 + 실제요청을 실패한 이유..


1 번 이유와 2번 이유가 충돌이 납니다.

1번 이유 때문에 withCredentials: true 를 정의했는데..

CORS 때문에 Filter를 적용하고 나면 인증 쪽에서 Access Denied 가 떨어집니다.


CORS Filter를 막으면 withCredentials: true 가 정상적으로 동작을 합니다.

인증도 정상적으로 처리됩니다.

Service 영역에서 조회되서 결과를 Return 하는 결과까지 확인이 됩니다.

문제는 CORS 때문인지 xhr.status 가 0 이 됩니다. ( 여러가지 이유가 있겠죠.. )


현재로서는 해결의 방법이 없습니다. ㅠ.ㅠ


이제 생각할 수 있는 방법은..

ajax + CORS Filter + oAuth 를 이용해서 RESTful API 환경을 구축하는 겁니다.


그래도 malalanayake ( http://ko.gravatar.com/malalanayake ) 께 감사드립니다.

자신의 소스를 전부 내주셨으니 덕분에 테스트를 해 볼 수 있었습니다.



Trackbacks 101 : Comments 0
위로
[CORS] javascript ajax 크로스 도메인 요청 하기
Exception | 2016. 8. 24. 20:55

1. 개발환경

ajax + RESTfule


2. 시나리오.

RESTful을 이용해서 서로 다른 domain간에 Json 으로 데이터를 주고 받을 수 있다.


그림 출처 : 시나몬 브레드님의 javascript ajax 크로스 도메인 요청 하기 (CORS)



사실 그림의 1번을 통해 권한을 인증하고, 인증된 권한을 통해 2번 실제 요청을 하는 시나리오를 구성하는게 최종 목적이였습니다.


그런데....

ajax를 통해서 같은 시도를 하면 실패합니다.


XMLHttpRequest cannot load http://localhost:8080/api/employees. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:7070' is therefore not allowed access.


데이터도 안가져 오더군요.. ㅡㅡ;;

검색을 해보니 CORS 라는 내용이 유력합니다. ( 시나몬 브레드님의 javascript ajax 크로스 도메인 요청 하기 (CORS) ) - 시나몬 브레드님 깊은 지식에 존경을...


그 관련 자료를 검색하고 확인해서 Filter를 이용하면 해결할 수 있다는 걸 알았습니다.



import java.io.IOException;


import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletResponse;


public class SimpleCORSFilter implements Filter {


    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletResponse response = (HttpServletResponse) res;

        response.setHeader("Access-Control-Allow-Origin", "*");

        response.setHeader("Access-Control-Allow-Methods", "POST, GET, DELETE, PUT");

        response.setHeader("Access-Control-Max-Age", "3600");

        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, origin, content-type, accept");

        chain.doFilter(req, res);

    }


    public void init(FilterConfig filterConfig) {}


    public void destroy() {}


}



web.xml 추가


    <filter>

        <filter-name>SimpleCORSFilter</filter-name>

        <filter-class>rest.api.filter.SimpleCORSFilter</filter-class>

    </filter>

    <filter-mapping>

        <filter-name>SimpleCORSFilter</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping>



그리고 ajax 호출 하면 됩니다.



  $.ajax({

      url : "http://localhost:8080/api/employees"

    , async : true

    , type : "POST"

    , cache:false

    , timeout : 30000 

    , data : JSON.parse(JSON.stringify({"id:id, pw:pw"}))

    , dataType : "json"

    , xhrFields: {

            withCredentials: false

      }

    , beforeSend: function (xhr) {

        xhr.setRequestHeader("Accept", "application/json");

      }

    , success : function (data, statusText, xhr) { 

        console.log("success status :: " + xhr.status + " || statusText :: " + statusText);

      }

    , error : function (xhr, statusText, errorThrown) { 

        console.log("error status :: " + xhr.status + " || statusText :: " + xhr.responseText + " || errorThrown :: " + errorThrown);

      }

  });




주의할 점.



async : true ( false 수행이 안됩니다. )


xhrFields: {

            withCredentials: false ( true는 status 값을 0을 리턴합니다. )

}



추가적인 문제는 Web Service를 수행하기 위해 테스트 한 결과입니다만...

SOAP을 이용하기 보다 RESRful을 이용한 Web Service 환경을 구축하고 싶었습니다만..


인증....


이것을 어떻게 풀어야 할 지 문제네요.. ㅋㅋ



Trackbacks 69 : Comments 0
위로
이전 페이지 다음 페이지
보이기/숨기기 가능합니다^^
«   2020/01   »
      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  
보이기/숨기기 가능합니다^^
헤르메ìŠ.. 2016
헤르메ìŠ.. 2016
헤르메ìŠ.. 2016
헤르메ìŠ.. 2016
헤르메ìŠ.. 2016
헤르메ìŠ.. 2016
헤르메ìŠ.. 2016
헤르메ìŠ.. 2016
헤르메ìŠ.. 2016
헤르메ìŠ.. 2016
헤르메ìŠ.. 2016
헤르메ìŠ.. 2016
헤르메ìŠ.. 2016
헤르메ìŠ.. 2016
헤르메ìŠ.. 2016
RSSFeed