Ace-T's Blog 내 검색 [네이버 커넥트 이웃 합니다~^-^/ 요청 大 환영~~]

ResourceBundleMessageSource, ReloadableResourceBundleMessageSource

OpenSource/Spring MVC 2014.04.24 10:24
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 

ResourceBundleMessageSource


  개요

 1차 처리

 버그??

 처 리


<< 개요 >>

ReloadableResourceBundleMessageSource 때문에 최적화 팀에서 빼달라고 연락이 왔다.

바로.. <property name="cacheSeconds" value="5" />

5초마다 계속 번들을 읽어들이고 캐시하는 옵션 때문이였다.


        

     << 1차 처리 >>

기존>

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">

<property name="basenames">

<list>

<value>WEB-INF/messages/MessageResources</value>

</list>

</property>

        <property name="cacheSeconds" value="5" />

</bean>


변경>

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">

<property name="basename">

<value>WEB-INF/messages/MessageResources</value>

</property> 

</bean>



     << 버그?? >>

번들을 찾지 못하는 오류가 났다...Why??? ㅠ _ ㅠ... 이유는 잘모르겠다..설정은 잘한것 같은데...

참고 사이트 : http://www.mkyong.com/spring/spring-resource-bundle-with-resourcebundlemessagesource-example/


     << 처 리 >>

처리는..cacheSeconds 옵션을 빼버리는것으로...처리 하였다.

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">

<property name="basenames">

<list>

<value>WEB-INF/messages/MessageResources</value>

</list>

</property>

        <property name="cacheSeconds" value="5" />  

</bean>

 


아래처럼 Default is "-1", indicating to cache forever  의 내용이므로..!!


/**

* Set the number of seconds to cache loaded properties files.

* <ul>

* <li>Default is "-1", indicating to cache forever (just like

* <code>java.util.ResourceBundle</code>).

* <li>A positive number will cache loaded properties files for the given

* number of seconds. This is essentially the interval between refresh checks.

* Note that a refresh attempt will first check the last-modified timestamp

* of the file before actually reloading it; so if files don't change, this

* interval can be set rather low, as refresh attempts will not actually reload.

* <li>A value of "0" will check the last-modified timestamp of the file on

* every message access. <b>Do not use this in a production environment!</b>

* </ul>

*/

public void setCacheSeconds(int cacheSeconds) {

this.cacheMillis = (cacheSeconds * 1000);

}



        - END -



저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

[Spring] SimpleAsyncTaskExecutor @Async 사용

OpenSource/Spring MVC 2014.01.28 18:17
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T



title : [Spring] SimpleAsyncTaskExecutor  @Async 사용 

 

index

1.

2. 참고 사이트

 

<< >>

1) SpringFramework 3.1

2) JUnit TEST

3) Log4j - Log쪽에 쓰레드 관련 녀석이 찍히도록 해놓음.

4) 설 정 

     <task:annotation-driven executor="simpleAsyncTaskExecutor" /> 
    <bean id="simpleAsyncTaskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" />

 

 

2014/01/24 - [OpenSource/Spring MVC] - [Spring] @Async 를 이용한 쓰레드 중복 테스트

 

참조 글 : 참조 글에 나오는 설정만 다르고 테스트는 동일 하다.

단, SimpleAsyncTaskExecutor는 Thread Pool이 없이 요청 시에 수행 되기 때문에 리소스 관련 문제는 성능 테스트를 해보았다. 문제 없었다. ^0^Good~

 

<< 참고 사이트 >>

1) http://docs.spring.io/spring/docs/3.1.4.RELEASE/javadoc-api/org/springframework/core/task/SimpleAsyncTaskExecutor.html

2)

 

            - END -

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

[Spring] <task:executor> @Async 를 이용한 쓰레드 중복 테스트

OpenSource/Spring MVC 2014.01.24 14:59
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 

 

 

title : [Spring] <task:executor> @Async 를 이용한 쓰레드 중복 테스트

 

index

1.

2. 시나리오

3.

4. 테스트 코드

5. 참고 사이트

 

<< >>

1) SpringFramework 3.1

2) JUnit TEST

3) Log4j - Log쪽에 쓰레드 관련 녀석이 찍히도록 해놓음.

4) 설 정

   <task:annotation-driven executor="asyncExecutor" />

   <task:executor id="asyncExecutor" pool-size="50" />

 

task:annotation : @Async를 사용 할 수 있겠죠잉~

task:executor :

 

<< 시나리오 >>

1) TEST-A : Thread Pool 50    / 호출 10

2) TEST-B : Thread Pool 50    / 호출 1000

2) TEST-C : Thread Pool 2000 /  호출 1000

 

<< >>

1) TEST-A : 중복 없음.

2) TEST-B : 중복 현상 나타남. Thread Pool 50, 호출은 1000 중복이 나다가 어느 시점에서 상이한 Thread 호출.

3) TEST-C : 중복 없음. Thread Pool 2000, 호출 1000


<< 테스트 코드 >>


1) 테스트 코드 - log4j 관련 녀석을 쓰기 위해서 @RunWith를 사용 함. 그냥 System.out.println으로 테스트 시

    AsyncThread.java에서 logger 대신 System.out.println으로 출력하면 됩니다~^-^good~

package kr.pe.acet.async;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


import com.kt.log4kt.KTLogger;

import com.kt.log4kt.KTLoggerFactory;



@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations = {

        "classpath:spring/context/async/context-test-properties.xml",

        "classpath:spring/context/async/context-test-common.xml", 

        "classpath:spring/context/async/context-test-mybatis.xml",

        "classpath:spring/context/async/context-test-datasource.xml",     

        "classpath:spring/context/async/context-test-mail.xml",        

        "classpath:spring/context/async/context-test-servlet.xml"})

        

public class AsyncAnnoTest {

KTLogger logger = KTLoggerFactory.getLogger(AsyncAnnoTest.class);


@Autowired AsyncThread asyncThread;

@Test

public void asyncAnnotationTest() {

//AsyncThread asyncThread = new AsyncThread();  동작하지 않음!! @Autowired를 해야함!

int scope = 1000;

logger.debug4Dev("==============[start]===================");

for(int i=0; i < scope; i++){

//asyncThread.threadAndLogTest2();

asyncThread.threadAndLogTest();

//asyncThread.threadAndLogTest3();

}

//asyncThread.threadAndLogTest2();

logger.debug4Dev("==============[end]===================");

}


}



AsyncThread.java

package kr.pe.acet.async;

import org.springframework.scheduling.annotation.Async;

import org.springframework.stereotype.Component;

import org.springframework.stereotype.Service;


import com.kt.log4kt.KTLogger;

import com.kt.log4kt.KTLoggerFactory;


@Component

public class AsyncThread {

private KTLogger logger = KTLoggerFactory.getLogger(AsyncThread.class);

private static int cnt = 0;

public void threadAndLogTest2(){

logger.debug4Dev("ACE-T");

}

@Async

public void threadAndLogTest(){

cnt++;

System.out.println(cnt+"번째 호출!!");

logger.debug4Dev("TAEHA("+cnt+")=====>"+Thread.currentThread());

}

public void threadAndLogTest3(){

threadAndLogTest();

}

}




결 과 : 아래처럼 출력이 되어짐! 사실 앞쪽에 쓰레드 관련 key 내역이 찍힘! ㅋㅋ

1번째 호출!!

2번째 호출!!  

 [2014-01-22 10:27:57] [DEBUG] [root.threadAndLogTest():27] - TAEHA(2)=====>Thread[asyncExecutor-2,5,main]

 [2014-01-22 10:27:57] [DEBUG] [root.threadAndLogTest():27] - TAEHA(1)=====>Thread[asyncExecutor-1,5,main]

3번째 호출!!                 

 [2014-01-22 10:27:57] [DEBUG] [root.threadAndLogTest():27] - TAEHA(3)=====>Thread[asyncExecutor-3,5,main]

. . . . . . 계속 .. . . . .

 

<< 참고 사이트 >>

자바지기님이 좋은 고려사항을 써주셨다.

1) 참고 사이트 : http://slipp.net/questions/10

2) http://docs.spring.io/spring/docs/2.0.0/reference/scheduling.html

3) http://whiteship.me/?tag=async   // 역시 백기선님! @Async에 관한 좋은 내용들이 있다.

 

마지막으로 여러가지 테스트를 해보니..

@Async가 먹히지 않는 경우는 2가지가 있다.

1) @Autowired가 아닌 new로 했을 경우

    ex) Test Code에서 @Autowired AsyncThread asyncThread;가 아닌

          AsyncThread asyncThread = new AsyncThread(); 로 인스턴스를 만들어 호출하였을 때

         동작하지 않았다.(기능 X)

2) 같은 Class 내에 있는 Method에서 @Async Method를 호출 하였을 때! 동작하지 않았다.(기능 X)

   ex) Test Code를 조금 변경!  

public class AsyncAnnoTest {
 KTLogger logger = KTLoggerFactory.getLogger(AsyncAnnoTest.class);

 @Autowired AsyncThread asyncThread;
 
 @Test
 public void asyncAnnotationTest() {
  
  //AsyncThread asyncThread = new AsyncThread();
  int scope = 1000;  
  logger.debug4Dev("==============[start]===================");
  for(int i=0; i < scope; i++){ 
   asyncThread.threadAndLogTest2();
   //asyncThread.threadAndLogTest();
   //asyncThread.threadAndLogTest3();
   
  } 
  //asyncThread.threadAndLogTest2();
  logger.debug4Dev("==============[end]===================");
 }

} 

 

 Target Code

@Component
public class AsyncThread {
 
 private KTLogger logger = KTLoggerFactory.getLogger(AsyncThread.class);
 private static int cnt = 0;
 
 
 public void threadAndLogTest2(){
  logger.debug4Dev("ACE-T");
  threadAndLogTest();  // @Async Method를 호출!! => @Async 기능 X
 }
 
 
 @Async
 public void threadAndLogTest(){
  
  cnt++;  
  System.out.println(cnt+"번째 호출!!");
  logger.debug4Dev("TAEHA("+cnt+")=====>"+Thread.currentThread());
  
  
 }
 
 public void threadAndLogTest3(){
  threadAndLogTest();  
 }
 

} 

 

결과 : 쓰레드가 모두 동일하다.(녹색은 그냥 만든 Key 값이다.)

53ff4311-b39c-4b9f-b705-af55e2c8916a_1 [2014-02-06 13:38:30] [DEBUG] [root.threadAndLogTest():28] - TAEHA(988)=====>Thread[main,5,main]
53ff4311-b39c-4b9f-b705-af55e2c8916a_1 [2014-02-06 13:38:30] [DEBUG] [root.threadAndLogTest2():18] - ACE-T
989번째 호출!!
53ff4311-b39c-4b9f-b705-af55e2c8916a_1 [2014-02-06 13:38:30] [DEBUG] [root.threadAndLogTest():28] - TAEHA(989)=====>Thread[main,5,main]
53ff4311-b39c-4b9f-b705-af55e2c8916a_1 [2014-02-06 13:38:30] [DEBUG] [root.threadAndLogTest2():18] - ACE-T
990번째 호출!!
53ff4311-b39c-4b9f-b705-af55e2c8916a_1 [2014-02-06 13:38:30] [DEBUG] [root.threadAndLogTest():28] - TAEHA(990)=====>Thread[main,5,main]
53ff4311-b39c-4b9f-b705-af55e2c8916a_1 [2014-02-06 13:38:30] [DEBUG] [root.threadAndLogTest2():18] - ACE-T 

 

정상적이라면..Thread[asyncExecutor-2,5,main] 요런식으로 수행한 asyncExecutor 가 찍혀야 한다.

 


                                   - END -


저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

[springframework] confing properties re-loading 기능

OpenSource/Spring MVC 2014.01.17 21:13
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 

 

[springframework] confing properties re-loading 기능

 

1. 배 경

2. 구 현

3. 결 과 

4. 참조 사이트


<< 배 경 >>

Spring을 사용하면서 config properties 파일이 WAS의 재가동 없이 반영 되어야 하는 경우가 있다.

찾아보았더니 org.apache.commons.configuration.PropertiesConfiguration를 통해서 구현 할 수 었다!!


<< 구 현 >>

   1) spring의 context-properties.xml(properties location이 있는 context) 에서 bean을 만든다.

   - context-properties.xml 부분

     <context:property-placeholder location="classpath:properties/config.properties"/>  


     이 부분 추가!! value에서 path부분에서 너무 많은 소요를 하였다..ㅠ.ㅠ...classpath: 를 넣었었다...

     <bean id="runtimeProperties" class="org.apache.commons.configuration.PropertiesConfiguration">            <constructor-arg type="java.lang.String"  value="properties/config.properties" />

      <property name="reloadingStrategy" ref="reloadingStrategy" />

</bean>


    <bean id="reloadingStrategy" 

          class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy" />    


  - bean이 등록이 되었다면(WAS 기동 시 잘 읽어들인다면), @Autowired를 하여 사용 하면 된다.

    @Autowired

    private PropertiesConfiguration runtimeProperties;


    public String getConfigProperites() {

        return (String)runtimeProperties.getProperty("config.test.acet");

    }



<< 결과 >>

테스트로 2가지를 해보았다.

@Value와 @Autowired private PropertiesConfiguration  2가지 버전으로 테스트를 하였다.

  [ 결과 ]

   getConfigProperites()=>486486

   value--->1000004


config.properties의 내용은 아래와 같다.

   # properties test

   config.test.acet=1000004


소스에서는 

Value는 @Value("${config.test.acet}")

             private String name;  로 가져와서 찍어주었고,

PropertiesConfiguration 는 위의 소스 처럼 가져와서 찍어주었다.


System.out.println("getConfigProperites()=>"+getConfigProperites());

System.out.println("value--->"+name);


WAS는 Tomcat 6.0을 사용하였고, local 에서 테스트를 위해 아래와 같이 설정을 해주어야 한다.

단, server.xml에서 다음과 같이 수정을 해줘야 한다.(very important~!!!)

<Host appBase="webapps" autoDeploy="false" name="10.214.184.86" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">


<Context docBase="ktdsOssDevPlay" path="/" reloadable="false" source="org.eclipse.jst.jee.server:ktdsOssDevPlay"/></Host> 


그런 다음 tomcat에서 Use workspace metadata를 사용하였으며 (Server 찍고~ 마우스 우클릭에서 Properties에서 선택 가능 ) 

C:\ACET\workingSpace\.metadata\.plugins\org.eclipse.wst.server.core\tmp3\wtpwebapps\ktdsOssDevPlay\WEB-INF\classes\properties에서 즉, 배포 된 녀석(config.properties)을 수정하였다. 486486으로^-^/


참조 사이트는 너무 이것저것 봐서...대충 띄워져있는 것만 써놨다. 그냥 구글링을 하시면 됩니다~


<< 참조 사이트 >>

1) http://commons.apache.org/proper/commons-configuration/apidocs/org/apache/commons/configuration/PropertiesConfiguration.html#PropertiesConfiguration(java.io.File)


2) https://jira.springsource.org/browse/SPR-4714


3) http://blog.naver.com/PostView.nhn?blogId=leehyogun&logNo=160766551


4) http://goodwilldd.blogspot.kr/2012/09/spring-properties-reload_13.html


아! PropertiesConfiguration.class를 보면 아래와 같다.

public class PropertiesConfiguration extends AbstractFileConfiguration { 블라블라~중에서 

발췌한 내용이다. 여기서 보아야 할 것은 PropertiesConfiguration의 bean을 만들 때 생성자를 만드는 부분이 있는데 그 생성자를 만들 때 어떻게 생성 하는지이다.

File, String, Url 등등 을 파라미터로 받아서 생성이 가능하다는 것이다.

더보기




                               - END - 




저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

  • 행인 2014.11.20 11:44 신고 답글 | 수정/삭제 | ADDR

    안녕하세요. Spring 환경에서 properties 를 톰캣 재기동 없이 변경하는 방법에 대해 찾다가 오게 되었는데요.글에서 설명해주신대로 xml 에 내용 세팅하고 @Autowired 로 프로퍼티에서 데이터를 잘 꺼내와서 사용하고 있는데 톰캣 기동중 프로퍼티를 변경하면 변경내용을 읽어오질 못하고 있습니다.
    톰캣에 대한 설정도 글에 쓰신대로 변경해주었고요.. 뭔가 에러가 나는게 아니라 어디가 잘못되었는지 어느걸 추가로 확인해야하는지도 모르는 상태 이고요 ㅜ_ㅡ
    제가 테스트 한 사항은 웹화면에서 파일을 업로드 하는데 업로드 경로를 프로퍼티에 지정해주고 업로드 요청 시 해당프로퍼티에서 경로를 가져와 등록합니다.
    로컬에서 톰캣 기동으로 테스트를 진행하였고 처음 업로드 시 경로와 도중에 프로퍼티에서 업로드 경로 수정 후 재업로드 시 경로를 확인하였는데 바뀐 경로가 적용이 안되더라고요...
    뭘 확인해야할지 감도 안잡히는데 어떻게 하면 좋을지..

  • 행인 2014.11.20 11:48 신고 답글 | 수정/삭제 | ADDR

    실제 소스상 설정 내용은 아래와 같습니다.
    ***** context-common.xml *******
    <bean id="runtimeProperties" class="org.apache.commons.configuration.PropertiesConfiguration">
    <constructor-arg type="java.lang.String" value="setting.properties" />
    <property name="reloadingStrategy" ref="reloadingStrategy" />
    </bean>

    <bean id="reloadingStrategy" class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy" />

    해당 파일에 위처럼 설정내용을 세팅하였고 해당파일은 context-root.xml 파일에
    <beans:import resource="context-common.xml" /> 로 지정되어있습니다.

    해당 xml 은 web.xml 에 지정한 상태이고
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    /WEB-INF/classes/config/spring/context-root.xml
    </param-value>
    </context-param>

    실제 서버에서 사용은 ServiceImpl 단에서
    @Autowired
    PropertiesConfiguration propertiesConfiguration;

    오토와이드 선언 후
    propertiesConfiguration.getString("FILE_ROOT";)
    이런식으로 파일경로를 가져와 사용하고 있습니다.

    경로는 잘 가져옵니다만 톰캣 기동 중 경로를 수정하면 수정 된 경로를 가져오지 못하고 있습니다..

    • Favicon of http://acet.pe.kr BlogIcon String Ace-T 2014.11.20 16:42 신고 수정/삭제

      안녕하세요!
      우선은 context-common.xml 에서 setting.properties를 가져와서 사용하시는건가요?
      <context:property-placeholder location="classpath:properties/setting.properties"/> <- 요부분이 보이질 않네요

      그리고 스프링쪽 셋팅중에 <beans:import resource="context-common.xml" /> 이부분을 context-root.xml 파일에서 import하지마시고 순서가 중요하니!

      스프링컨테이너에 올리실 때 저부분을 아래처럼 web.xml올라갈때 load시켜보세요
      <servlet>
      <servlet-name>AcetTest</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
      classpath:applicationContext-servlet.xml
      </param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
      </servlet>

      <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
      classpath:applicationContext.xml,
      classpath:context-common.xml
      </param-value>
      </context-param>
      그리고 포스팅에 씌여져있는데로 톰캣에서 autoDeploy등 설정 하신 뒤에
      직접 배포 된것을 수정해서 테스트해보셔야 합니다~

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Heuristic completion: outcome state is mixed; nested exception is javax.transaction.HeuristicMixedException / TwoPhaseOutcome.HEURISTIC_HAZARD

OpenSource/Spring MVC 2013.06.10 15:27
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 

환경 : Global Transaction을 사용 시 2개의 PostgreSQL을 사용 함.

 

주의 할 사항으로는 postgreSQL에서 config 파일인 data/postgresql.conf에서

max_prepared_transactions = 10         # zero disables the feature

을 양쪽 다 수정해주어야 한다. default가 0 일 것이다. 맨 아래에 참고 한 외국인 형님 사이트가 있다.

덕분에 수정하여 2pc 트랜잭션을 잘 할수 있었다^-^

[2013-06-10 13:53:10] [DEBUG] [BoardController.debug4Dev():497] - vo token : -1479550304
[2013-06-10 13:53:10] [DEBUG] [BoardFacade.debug4Dev():497] - --------Start insertXaBoard----------
[2013-06-10 13:53:10] [DEBUG] [BoardFacade.debug4Dev():497] - --------End insertXaBoard----------
[2013-06-10 13:53:10] [DEBUG] [BoardFacade.debug4Dev():497] - --------Start insertXaBoard----------
[2013-06-10 13:53:10] [DEBUG] [BoardFacade.debug4Dev():497] - --------End insertXaBoard----------
[2013-06-10 13:53:10] [ WARN] [loggerI18N.topLevelPrepare():281] - [com.arjuna.ats.internal.jta.resources.arjunacore.preparefailed] [com.arjuna.ats.internal.jta.resources.arjunacore.preparefailed] XAResourceRecord.prepare - prepare failed with exception XAException.XAER_RMERR
[2013-06-10 13:53:10] [ WARN] [arjLoggerI18N.End():1794] - [com.arjuna.ats.arjuna.coordinator.BasicAction_36] - BasicAction.End() - prepare phase of action-id ad6b856:c852:51b540bf:cb failed.
[2013-06-10 13:53:10] [ WARN] [arjLoggerI18N.End():1808] - [com.arjuna.ats.arjuna.coordinator.BasicAction_38] - Action Aborting
[2013-06-10 13:53:10] [ WARN] [loggerI18N.topLevelAbort():432] - [com.arjuna.ats.internal.jta.resources.arjunacore.rollbackxaerror] [com.arjuna.ats.internal.jta.resources.arjunacore.rollbackxaerror] XAResourceRecord.rollback - xa error XAException.XAER_RMERR
[2013-06-10 13:53:10] [ WARN] [arjLoggerI18N.doAbort():3299] - [com.arjuna.ats.arjuna.coordinator.BasicAction_52] - Top-level abort of action ad6b856:c852:51b540bf:cb received heuristic decision: TwoPhaseOutcome.HEURISTIC_HAZARD
[2013-06-10 13:53:10] [ERROR] [ERROR_LOGGER.error():460] - Heuristic completion: outcome state is mixed; nested exception is javax.transaction.HeuristicMixedException
[2013-06-10 13:53:10] [DEBUG] [BoardController.debug4Dev():497] - 생성된 토큰 : -776585088
[2013-06-10 13:53:10] [DEBUG] [BoardController.debug4Dev():497] - -------------------- start board controller -------------------
[2013-06-10 13:53:10] [DEBUG] [BoardController.debug4Dev():497] - searchText :
[2013-06-10 13:53:10] [DEBUG] [BoardController.debug4Dev():497] - pageIndex :1
[2013-06-10 13:53:10] [DEBUG] [BoardFacade.debug4Dev():497] - -------------------- start board facade -------------------
[2013-06-10 13:53:10] [DEBUG] [BoardFacade.debug4Dev():497] - boardListVo :

 

참고 사이트 : Thank you~:D

http://labnotes.decampo.org/2013/03/heuristicmixedexception-with-postgresql.html

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class

OpenSource/Spring MVC 2013.06.10 11:05
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 

<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/>

설정 시 아래와 같은 오류가 났다..

 

Could not autowire field: com.kt.guide.board.facade.BoardFacade com.kt.guide.board.controller.BoardController.boardFacade; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'boardFacade': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.kt.guide.board.service.BoardService com.kt.guide.board.facade.BoardFacade.boardService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'boardService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.kt.guide.board.dao.pna.BoardDao com.kt.guide.board.service.BoardService.boardDao; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'boardDao': Post-processing of the FactoryBean's object failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class[class $Proxy217]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class $Proxy217
 at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:213)

 

class proxy를 사용 할 시 제약 조건 중에 final class를 사용하면 안된다는 것이 있는데..

어디에선가..사용을 하고 있는 것 같다.

 

그래서 결론적으로! 주의사항으로 콘크리트기반(POJO)일 때는 aop의 포인트컷 표현식에서 범위를 짧게 주어 final class가 걸리지 않도록 해주어야 한다.

 

                      - END -

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

2PC, JTA 사용 시 데이터소스가 하나만 먹히는 문제

OpenSource/Spring MVC 2013.05.27 02:08
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 [그리운 만슈니..ㅠㅠ]

 

아래의 설명은 위의 사진과는 무관합니다! ^-^

 

2PC, JTA 사용 시 데이터소스가 하나만 먹히는 문제

 

환경

was : jboss eap 5.1 - xa datasource 설정

springframework 3.1 - jta manager 사용

@MVC 기반 => Facade - Service - Dao - Mybatis

postgreSQL 9.2(local- windows ver)

postgreSQL 9.2(remote - windows ver)

mybatis 3.1.1

 

 


 

TEST

Facade(POJO) - Service(POJO) - Dao - Mybatis 이나

Facade - FacadeImpl - Service - Dao - Mybatis 구조로 테스트 함.

 

[Facade - FacadeImpl - Service - Dao - Mybatis 구조]

1) JDK 다이나믹 프록시 사용 & Class프록시 사용

결과 : FacadeImpl 즉, 구현클래스에 @Transactional 사용(롤백, Required_NEW 등 2PC 트랜잭션 잘됌)

      그러나 Class 프록시로 전환 뒤 Service에 @Transactional 해보았지만 트랜잭션 먹히지 않음.

      커뮤니티에 문의 한 결과..정확하게 말해주는 사람은 없었음. 그러나 순수 class까지도 되어야 한다고 함.

 

[Facade(POJO) - Service(POJO) - Dao - Mybatis구조]

2) Class 프록시 사용

결과 : JTA를 사용하였지만 데이터소스 하나만 잘됨. 2PC일 때 다른 데이터소스는 트랜잭션이 먹히지 않음. 단일 트랜잭션임에도 불구하고..

 

 


 

추측

1. PostgreSQL AutoCommit 문제

  

2013/05/25 - [DataBase/Postgresql] - windows postgreSQL autocommit off 만들기

 

2.XA Datasource는 조금 다른지..

http://forum.springsource.org/showthread.php?100710-JTA-on-JBoss-not-working&s=e077b42fd45ae3a3177a01c90339893c 참고

 

 


 

주저리

 

아..스프링 시큐리티도 해야하는데..완전 손놓고 있네..이노무 Global Transaction.....@.@;;

해결 되면 업데이트 하겠음!!~

 

 

 https://community.jboss.org/message/747830#747830

 

 


 

해결!!~

Mybatis에서 map 중복이 있어서 해당 datasource를 잘 찾지 못하거나 다른 db에 들어가는 현상이 있었다!!


라고 해결 한줄 알았으나!!  그게 아니였다!!

한 클래스내에서 메소드별로 @Transactional이라는 것으로 전파속성을 달리해서 사용한다면 예를 들어서 한 클래스내에 A라는 메소드에서B라는 메소드를 호출 시에 B에서 전파속성을 Reqired_new를 사용 할 경우에 트랜잭션이 타지 않는 현상이 있습니다.
이를 해결해주기 위해서는 메소드를 클래스로 하나 빼서 처리를 하면 됩니다. 이와 비슷한 경우는 @Asyne라는 어노테이션에서도 발생을 합니다.

 

- 끝 -

 

 

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

@Valid

OpenSource/Spring MVC 2013.01.24 20:51
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


@Valid 이녀석...뭔지만 대~충 알고 있었던 녀석이다.
야근을 하며..조금 더 깊게 파 보았다 ㅋㅋ


우선 괜찮은 글귀를 하나보자!~

더보기


아!~단순한 소스가 아닌 여러가지가 얽혀있는 우리의 멋진 소스+ㅁ+/

Valid...언제 발동 하는 녀석인가???
상황은 이러하다..
1) 예를 들어 클라이언트가 즉, 사용자가 등록 창에서 title을 10자 이상 적어야하는데 적지 않았다면?!
2) 예외가 난다. 그럼 이제 소스에서 발동을 한다.

@ExceptionHandler(MethodArgumentNotValidException.class)  이 annotation을 쓰면

MethodArgumentNotValidException.class

더보기



3) 예외가 나서 잡아내면!!
List<FieldError> fieldErrors = error.getBindingResult().getFieldErrors();
error객체를 통해서 어떤 에러인지 가져온다!
그 에러객체를 가지고 내부적인 로직을 타서 가공 한뒤에!
리턴을 해준다. 그것을 가지고 alert()창을 뜨우면 끝!~

현재 보고있는 소스는 json형태이다. 그래서 결과는 @ResponseBody에 담기게 되어진다.
담긴 것을 가지고 내부적으로 websquare이라는 녀석이 자바스크립트에서 alert을 띄우게 된다.

여기에서 중요한 내부적으로 가공을 한다는 것은 메시지번들로 미리 properties에 에러 메시지들을 만들어 놓고 key와 value로 가져와서 처리를 해준다.

토비책에도 그런식으로 하는 방법이 있다고 소개하고 있다. 볼륨2~+ㅁ+/

퇴근을 해야하니..이만...끝~~~

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

웹??? web.xml은 알고 하자!!

OpenSource/Spring MVC 2012.11.09 19:24
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


웹 프로그램을 한지..몇년차 되지는 않지만..
web.xml을 제대로 공부해본적이 없었다..OTL

하지만! 시작이 반이라고 했다.
지금이라도 하면 되는것! ㅋㅋ

자! 해보자~

★ Index
1. web.xml 이란???
2. 구성 내용
3. 작성 규칙

4. web.xml 틀
5. 구성 태그 설명
 



[1] web.xml이란?
    정의 :   Web Application의 Deployment Descriptor(환경파일) 로써 XML형식의 파일~!!!

[2] 구성내용
    1) ServletContext의 초기 파라미터
    2) Session의 유효시간 설정
    3) Servlet/JSP에 대한 정의
    4) Servlet/JSP 매핑
    5) Mime Type 매핑
    6) Welcome File list
    7) Error Pages 처리
    8) Listen/Filter 설정
    9) 보안

추가설명
  - web.xml은 <web-app> 태그로 시작하고 종료하는 문서로써 web.xml이 정의 된
    Web Application의 동작과 관련된 다양한 환경 정보를 태그 기반으로 설정하는 파일이다.
  - web.xml 의 작성 규칙은 XML Schema 로 정의 되어 있고, web.xml을 구성하는 모든 태그들에
    대하여 모두 학습하는 것은 의미가 없다.(헉..뜨끔!! 다 학습해버릴라고 했는데..ㅋㅋㅋ)
    web.xml의 태그들과 관련된 Servlet 기술을 학습 할 때 같이 학습하는 것이 좋은 방법이다.(고뢔??--;;)

[3] 작성 규칙
   1) Servlet 2.3까지의 web.xml의 작성 규칙은 DTD파일이였고, 2.4부터 XML Schema파일로 바뀜.
   2) 다음과 같이 web.xml 루트 엘리먼트인 <web-app>태그에 사용 될 XML Schema를 선언해 주어야 함.

더보기

  3) web.xml에는 목적과 용도에 따라 필요한 태그만을 작성하면 되지만 태그의 작성 위치가 중요하다!
     라고 하였는데..스키마에 위치한 순서대로 태그 작성을 하지 않아도 된다.
     하지만! filter -> filter-mapping 등은 순서로대 해야 할 듯 싶다!(당연한 소리인가;;)
  4) XML 문서이니 만큼 대소문자 구분, 속성에 값을 할당 할 때 인용부호지정, 시작 태그와 종료 태그의
     매핑에 대하여 주의 깊게 작성하여야 함.

자~! 여기서 잠깐!! 스키마를 살펴 보자!
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd
위의 링크를 따라서 다운로드를 받고 에디터로 열어보자!

ex) 기타 등등 설정이 되어있다~

더보기



[4] web.xml 틀!! 은 대~~충 이러하다. --;;

더보기


[5] 구성 태그 설명
    web.xml의 내용을 아래의 내용을 참고하여 살펴보면 된다.

   <web-app> 아래 레벨의 태그들   


출처 : http://blog.naver.com/b1ack7circ1e?Redirect=Log&logNo=10052647428

추가적인 태그 설명

더보기



참고사항 web.xml tag 실행 순서!!+ㅁ+ good~
단, 찾아본 결과 http://java.sun.com/dtd/web-app_2_3.dtd 의 스키마에서 나온 것들이 많았다..
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd 에서..더 찾아봐야 할 것 같다.
그냥 아래내용은 참고만 해두면 좋을 것 같다^-^;;;

더보기



                                    - END -


저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Spring MVC의 주요 구성요소

OpenSource/Spring MVC 2012.11.09 17:09
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

      1) DispatcherServlet : 클라이언트의 요청을 전달 받는다. 컨트롤러에게 클라이언트의 요청을 전달하고,
          컨트롤러가 리턴한 결과 값을 View에 전달하여 알맞은 응답을 생성 하도록 함(스프링 제공)

      2) HandlerMapping : 클라이언트의 요청 URL을 어떤 컨트롤러가 처리 할지를 결정(스프링 제공)

      3) Controller : 클라이언트의 요청을 처리 한 뒤, 그 결과를 DispatcherServlet에 알려준다. 
                              (실제 로직을 담당)

      4) ModelAndView : 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담는다.

      5) ViewResolver : 컨트롤러의 처리 결과를 생성 할 뷰를 결정(스프링 제공)

      6) View : 컨트롤러의 처리 결과 화면을 생성

동작 설명

   1) 클라이언트의 요청이 DispatcherServlet에 전달 

   2) DispatcherServlet은 HandlerMapping을 사용하여 클라이언트의 요청을 처리할  

   3) 컨트롤러 객체를 구함

   4) DispatcherServlet은 컨트롤러 객체의 handleRequest()메서드를 호출하여 

   5) 클라이언트의 요청을 처리

   6) 컨트롤러의 handlerRequest()메서드는 처리 결과 정보를 담은 ModelAndView 객체를 리턴

   7) DispatcherServlet은 ViewResolver로부터 응답 결과를 생성 할 뷰 객체를 구함

   8) 뷰는 클라이언트에 전송 할 응답을 생성


    더 자세한 내용은 아래의 링크를 참조!
    출처 : http://snoopy81.tistory.com/196



Spring 레퍼런스를 참고해보면..
http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html





저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

SOAP(Simple Object Access Protocol)이란?

OpenSource/Spring MVC 2012.11.09 15:25
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

soap??? 비누?? @.@;;;;;

웹을 구현하는데 있어서...Web Service라는 놈이라는 장벽에 부딪혔다..ㅠ.ㅠ..
모르면 학습만 있을뿐!! +ㅁ+/ good~

SOAP은 XML과 HTTP 통신을 기반으로 하여 네트워크 상에 존재하는 각종 컴포넌트간의 호출을
효율적으로 실현하기 위한 방법을 제시하는 규약이다.
다시 말해 네크워크상에서 Client와 Service Provider간에 메시지를 요청하고 이에 응답해주는 방법을 제공!
이러한 방식들은 기존의 RPC(Remote Procedure Call)이라 묶여서 불려오던 것이고 SOAP은 RPC의 한가지 방법이라 할 수 있다.

SOAP의 특징
1) Application Layer Protocal 들 중에 HTTP를 사용함으로써 여러 시스템간의 통신과 통합을 위한
    좀 더 단순하면서도 가벼운 메카니즘을 제공.
2) HTTP를 사용하게 된 중요한 이유는 바로 방화벽에 제한을 받지 않는 범용성 때문이라 할 수 있다.
    다른 Application Layer Protocal의 경우 그들만의 약정된 TCP or UDP 포트를 사용하기 때문에
    인터넷상에 설치 되어있는 방화벽에 많은 제약을 받게 된다.
3) SOAP은 SOAP만이 가지는 특정한 HTTP Header를 방화벽의 필터링 부분에 보냄으로써 메시지의
    통과여부를 가릴 수 있게 하는 방법으로 보안이라는 문제를 해결한다.

SOAP 내부
1) SOAP은 크게 네가지로 구성 되어있다,
  [1] SOAP envelope
        : Message에 무엇이 있는가. 누가 무엇을 다루는가, 어떤 것이 Optional 이고 manatory를
           나타내기 위한 전체적인 Framework를 제공한다.
   [2] SOAP encoding rules
        : Application에 정의 된 data type들의 instance를 교환하는데 사용되는 메카니즘이다.
   [3] SOAP RPC 표현
        : Remote procedure call과 response들을 나타내는데 사용되는 규약을 정의 한다.
   [4] SOAP binding
        : 두 peer간의 전송 프로토콜을 사용하여 SOAP envelope 교환에 대한 규약을 정의 한다.

위의 4가지 중 envelope와 encoding rule은 서로 다른 namespace에 정의되어있는 XML이며,
link를 걸어 놓음으로써 정의된 내용을 사용 할 수 있다.

SOAP은 Message Based Protocol이기 때문에 두 시스템간의 통합 시 쌍방 간의 Message Format만을 약속하면 되므로 통합시간 및 효율을 높일 수 있으며, 매우간단하다.(레알??)



SOAP은 HTTP 통신을 위한 WebServer, XML과 Service Provider의 3가지로 구성 되어있다.

★ SOAP의 동작방식
 1) Client가 어떤 Service Provider의 Service가 어떤 것이 있는지를 파악하기 위해 제공하는 Service의 
     목록을 HTTP를 통해 XML 형태로 요청한다.
     (만약 목록을 이미 알고 있는 경우이면 이 과정은 생략 가능)

 2) Server는 자신이 제공하는 Service의 목록을 XML로 응답을 보낸다.
     (만약 목록을 이미 알고 있는 경우이면 이 과정은 생략 가능)

 3) 응답을 받는 Client는 그 중 자신이 원하는 Service를 알아내어 다시 Provider에 요청한다.

 4) Provider는 받는 요청에 대한 처리를 한 후 결과를 되돌려준다.

2. SOAP Message

 

다음은 HTTP Request 속에 포함된 SOAP Message의 구조이다..

 

POST /StockQuote HTTP/1.1

Host: www.stockquoteserver.com

Content-Type: text/xml; charset="utf-8"

Content-Length: nnnn

SOAPAction: "http://example.org/2001/06/quotes"

 

<Envelope ...>

   <Header>

      ......

   </Header>

 

   <Body>

      <Content>

         ......

      </Content>

   </Body>

</Envelope>

 

° Envelope : Root Tag로써 SOAP Message가 시작됨을 나타낸다.

° Header : 가외의 정보를 나타내기 위한 것으로 생략이 가능하다.

° Body :  내용이 들어가는 Tag이며 다양한 형태의 태그들이 들어간다.

° Content : 서비스에 대한 요청이나 응답이 들어간다.

 

 

일단 간단한 예제를 보면서 이해해보자

 

SOAP은 XML의 형태로 Message를 교환한다

 

 

 Example 1 ( Request Message 형태 )

 

POST /StockQuote HTTP/1.1

Host: www.stockquoteserver.com

Content-Type: text/xml; charset="utf-8"

Content-Length: nnnn

SOAPAction: "http://example.org/2001/06/quotes"

 

<env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" >

 <env:Body>

  <m:GetLastTradePrice

        env:encodingStyle="http://www.w3.org/2001/06/soap-encoding"

        xmlns:m="http://example.org/2001/06/quotes">

    <symbol>DIS</symbol>

  </m:GetLastTradePrice>

 </env:Body>

</env:Envelope>

 

Service Provider가 가지고 있는 서비스 중에 LastTradePrice 정보를 요청하는 SOAP Message로 DIS의 값을 요구하고 있다.

[위에서 말했듯이 서비스 파악!!을 하는 거라 할 수 있다.

 "Service의 목록을 HTTP를 통해 XML 형태로 요청한다."]
 

 

 

 Example 2 (Response Message 형태 )

 

HTTP/1.1 200 OK

Content-Type: text/xml; charset="utf-8"

Content-Length: nnnn

 

<env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" >

 <env:Body>

  <m:GetLastTradePriceResponse

        env:encodingStyle="http://www.w3.org/2001/06/soap-encoding"

        xmlns:m="http://example.org/2001/06/quotes">

   <Price>34.5</Price>

  </m:GetLastTradePriceResponse>

 </env:Body>

</env:Envelope>

 

Response Message의 경우에는 Client가 요청한 Service 이름에 Response가 붙게되며(GetLastTradePriceResponse) Request에 대한 결과 값을 가지고 있다.

 

 

그럼 좀더 구체적으로 살펴보자!!!!

 

2-1. SOAP Envelope

 

SOAP Message는 필수항목인 SOAP envelope와 생략 가능한 SOAP Header 그리고 SOAP Body로 구성되어 있는 XML Document이다.

 

2-2. SOAP Header

 

SOAP는 Header라는 element를 통해 통신을 하는 쌍방 간의 어떤 제약없이 Message를 확장할  있는융통성 있는 구조를 제공한다. 일반적으로 Header는 authentication이나 transaction과 같은 비교적 연관성이 없는 정보들을 구현할  있도록 해준다.  Header element는 SOAP Envelope 바로 다음에 오는 번째 Child element로서 모든 Header 다음에 오는 Child element들을 Header Entry라고 한다.

 

Example 3 ( SOAP Header block )

 

<env:Header xmlns:env="http://www.w3.org/2001/06/soap-envelope" >

  <t:Transaction xmlns:t="http://example.org/2001/06/tx" env:mustUnderstand="1" >

    5

  </t:Transaction>

</env:Header>

 

2-3 SOAP Body

 

SOAP Body element는 필수 정보를 교환하기 위해 사용되는 간단한 메카니즘을 제공한다. 
일반적으로Body는 어떤 결과나 error를 보고하기 위해 사용된다. Body는 SOAP Envelope 바로 다음에 오는 Childelement로서 만약 Header가 존재하면 Header 다음에 와야하고 Header가 정의되어있지 않으면Envelope 바로 다음에 와야한다. Header와 마찬가지로 Body element 바로 다음에 오는 Child element들을 Body entry라고 부른다.

 

2-4. Fault Code

 

SOAP은 error를 reporting 하기 위해 Fault element를 사용한다.  Fault element는 다음과 같은 Childelement로 구성된다.

 

° faultcode : Software나 Provider가 사용하는 error number로 error를 구분하기 위해 사용된다. 반드시존재해야하는 element이다.

° faultstring : error에 대한 간단한 이유나 제목을 기술하며 반드시 존재해야하는 element이다.

° faultactor : message 경로에서 누구에 의해 야기되는 error인지에 대한 정보를 나타낸다. 반드시 존재해야하는 것은 아니다.

° detail : error에 대한 상세 정보를 기술한다. 반드시 요구되는 것은 아니고 사용자가 정의한 error tag가  있다.

 

Example 4 ( SOAP Fault Code )

 

<env:Envelope xmlns:env='http://www.w3.org/2001/06/soap-envelope'

                      xmlns:f='http://www.w3.org/2001/06/soap-faults' >

  <env:Header>

    <f:Misunderstood qname='abc:Extension1'

                                xmlns:abc='http://example.org/2001/06/ext' />

    <f:Misunderstood qname='def:Extension2'

                                xmlns:def='http://example.com/stuff' />

  </env:Header>

  <env:Body>

    <env:Fault>

      <faultcode>MustUnderstand</faultcode>

      <faultstring>One or more mandatory headers not understood</faultstring>

    </env:Fault>

  </env:Body>

</env:Envelope>


출처 : http://blog.naver.com/devils129/80009306881

참고 사이트 :  http://www.w3.org/TR/2011/REC-ws-soap-assertions-20111213/
참고 자료     : http://ettrends.etri.re.kr/PDFData/25-2_112_120.pdf

참고내용

더보기


저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

티스토리 툴바