xrp_coil

레이블이 spring인 게시물을 표시합니다. 모든 게시물 표시
레이블이 spring인 게시물을 표시합니다. 모든 게시물 표시

2012년 5월 30일 수요일

스프링(spring) 3.0 Annotation 파일 다운로드(File Download) 구현하기.


그냥 파일다운로드는 다른 사람들의 포스팅에도 있어서 금방했는데...

프로퍼티에서 가져와서 구현을 하려고 했더니 클래스패스를 잡지 못해서

request.getClass().getResource("/").getPath() 를 사용하면 이상하게 자꾸 톰캣 라이브러리 쪽으로 패스를 가져온다.

그래서 바꾼것이 currentThread에서 클래스로더를 가져오고 거기에서 getResource로 프로퍼티의 위치를 가져오는식으로 바꿈. 그래도 이렇게 해서 되니까~ 다행~ .

그것때문에 좀 더 시간이 걸렸슴.


우선 첫번째로 해야할 부분. 파일다운로드용 ViewResolver를 선언.

- dispatcher-servlet.xml




두번째로, Controller 구현. 일반적으로 공통 controller를 만들고 bean으로 만드는데 저는 그냥 업무마다 각각의 controller에서 구현했슴. 원래 properties에서 가지고 오는 부분은 공통클래스로 되어있으나 포스팅을 위해 잠시...
- templeteFileController.java






세번째로. 파일다운로드 뷰 bean으로 넘긴 후, 처리해야할 로직 구현.
- FileDownloadView.java





네번째로 jsp에서 필요 파라메터를 넘긴 후, 다운로드 테스트.
- test.jsp





* 참고 프로퍼티 파일은 아래와 같습니다. 경로는 src 바로 아래에 있구요.
- test.properties





다운로드 부분은 얼마전 작성한 아래 포스팅을 참고하시면 됩니다.

ajax로 파일다운로드 구현.
http://leinger.blogspot.com/2012/05/ajax.html


다른 세팅에 비해 비교적 간단하게 보이기는 하지만. 이것도 몇 시간에 걸쳐서 한... 나는..

역시.. 배울게 많은 프로그래머이다...ㅠ_ㅠ


======================================
2012-05-31 내용추가

로컬서버에서 잘 돌아가던 다운로드가 linux서버로 올리고나니 돌아가지 않는다. 원인을 찾아보니.

local서버에서 돌릴때 controller의 properties 파일을 가져오는 부분에서 url은


url.toString()::::::file:/D:/project/Java/.metadata/.plugins/org.eclipse.wst.server.core/tmp3/wtpwebapps/Test/WEB-INF/classes/test.properties
url.toString().substring()::::::D:/project/Java/.metadata/.plugins/org.eclipse.wst.server.core/tmp3/wtpwebapps/Test/WEB-INF/classes/test.properties

테스트서버에서 url은


url.toString()::::::file:/usr/local/tomcat7.0.23/webapps/ROOT/Test/WEB-INF/classes/test.properties
url.toString().substring()::::::usr/local/tomcat7.0.23/webapps/ROOT/test/WEB-INF/classes/test.properties

즉. 절대경로이기 때문에 local서버에서는 substring 6자리가 맞지만. linux서버에서는 substring 5자리로 변경해 주어야 한다. 

편하게 만들려고 했는데.. 점점 불편해지고 있는...ㅠㅠ os체크라도 해야하나..ㅠㅠ


결론...;;; 아래 로직 추가.




int substrStartAt = 0;
      String osName = System.getProperty("os.name").toLowerCase();
      if(osName.indexOf("win")>=0){
       substrStartAt = 6;
      }else if(osName.indexOf("mac")>=0){
       substrStartAt = 5;
      }else if(osName.indexOf("nix")>=0 || osName.indexOf("nux")>=0){
       substrStartAt = 5;
      }else if(osName.indexOf("sunos")>=0){
       substrStartAt = 5;
      }

2012년 5월 16일 수요일

spring에서 ibatis 트랜잭션(transaction) 처리.


기본적으로 사용하는 트랜잭션 처리가



 
try {
   sqlMap.startTransaction()
   Employee emp2 = new Employee();
   // ...set emp2 data
   Integer generatedKey = (Integer) sqlMap.insert ("insertEmployee", emp2);
   emp2.setFavouriteColour ("green");
   sqlMap.update("updateEmployee", emp2);
   sqlMap.commitTransaction();
}catch(Exception e){
    sqlMap.getCurrentConnection().rollback();
    e.printStackTrace();
    throw e;
} finally {
   sqlMap.endTransaction();
 }


위처런 startTransaction 과 endTransaction 을 사용하는 방식인데.

아무리 해도. 적용이 되지 않는다...
분명히 rollback 도 타는데 말이다.


검색질 중에 http://javastore.tistory.com/103 포스팅의 도움으로 해결.


applicationContext.xml 에 아래와 같이 추가한다.




daoImpl.java 에는 아래와 같이 setter를 만들어준다.

@Autowired
 private TransactionTemplate transactionTemplate;
 
 public void setTransactionTemplate(TransactionTemplate transactionTemplate){
  this.transactionTemplate = transactionTemplate;
 }


메서드 부분은 아래와 같다.


private int saveCaseLowReal(HashMap hmap) throws Exception {
                        ghmap = hmap;
   
   
   boolean result = false;
   result = (Boolean)transactionTemplate.execute( new TransactionCallback() {
    public Object doInTransaction(TransactionStatus status) {
     try {

                                                      /*인서트 로직.*/      

      return true;
     }catch (Exception e){
      e.printStackTrace();
      status.setRollbackOnly();
      return false;
     }
    }
   });

}


대략의 로직으로 보아 excute 하기 전에 true인지 false 인지 판별해서 던져주는듯 하지만..

불편하다...-_-;;;;;


이거보다 좋은 방법 있으신분은 링크를 댓글로 Plzzzzzzz..... ㅠㅠ


2012년 5월 9일 수요일

@Autowired :: nested exception is org.springframework.beans.NotWritablePropertyException 해결.

아오.. 세팅하다가 이것때문에 무지 고생했네요.

다 허접한 실력때문이겠지만...ㅠㅠ

여튼 에러의 내용은 아래와 같습니다. 아래 색칠한 부분을 구글 번역기로 돌리면...

 클래스의 잘못된 부동산'loginDao'[com.kis.web.system.login.service.LoginService] :  재산'loginDao는'쓰기 아니거나 잘못된 세터 메소드를 가지고 있습니다.세터 매개 변수 타입은 게터의 반환 형식이 일치하는가?
라고 나옵니다..-_-;; 뭔소리야.. -_-^

짧은 영어실력으로 보자면 일단 getter와 setter 부분이 잘못되어서Bean을 만들수 없다는건데말이지요.. 해결을 하자면....

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginService' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'loginDao' of bean class [com.kis.web.system.login.service.LoginService]: Bean property 'loginDao' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1361) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4723) at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5226) at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5221) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'loginDao' of bean class [com.kis.web.system.login.service.LoginService]: Bean property 'loginDao' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1024) at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:900) at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:76) at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1358) ... 21 more



applicationContext.xml 의 내용입니다.

<Bean id="loginDao"> 로 되어있습니다.

LoginService.java 의 내용입니다.

public void setUserDao(LoginDao loginDao) { 로 만들어져 있네요.

위 부분을 아래와 같이 맞춰줍니다.

public void setLoginDao(LoginDao loginDao) {

그리고 서버를 재시작..

잘돌아 갑니다.. 왜 이름을 다르게 했을까요..ㅠㅠ 버린시간이 너무 아깝네요.ㅠ