2010년 9월 5일 일요일

TypeHandlerCallback 예시

package com.naver.jr.fun.model.quiz.handler;
import java.sql.SQLException;
import org.apache.commons.lang.StringUtils;
import com.ibatis.sqlmap.client.extensions.ParameterSetter;
import com.ibatis.sqlmap.client.extensions.ResultGetter;
import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;
import com.naver.jr.fun.model.quiz.QuizCategory;
public class QuizCategoryTypeHandler implements TypeHandlerCallback {
 @Override
 public Object getResult(ResultGetter getter) throws SQLException {
  String str = getter.getString();
  if (StringUtils.equals(QuizCategory.COMMON.toString(), str)) {
   return QuizCategory.COMMON;
  } else if (StringUtils.equals(QuizCategory.COUNTRY.toString(), str)) {
   return QuizCategory.COUNTRY;
  } else if (StringUtils.equals(QuizCategory.PROVERB.toString(), str)) {
   return QuizCategory.PROVERB;
  } else if (StringUtils.equals(QuizCategory.RIDDLE.toString(), str)) {
   return QuizCategory.RIDDLE;
  } else if (StringUtils.equals(QuizCategory.TEXTBOOK.toString(), str)) {
   return QuizCategory.TEXTBOOK;
  } else if (StringUtils.equals(QuizCategory.TV.toString(), str)) {
   return QuizCategory.TV;
  }
  else {
   throw new SQLException("Unexpceted value " + str + " found. " + QuizCategory.class.toString()
    + " was expected.");
  }
 }
 @Override
 public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {
  switch ((QuizCategory)parameter) {
   case COMMON:
    setter.setString(QuizCategory.COMMON.toString());
    break;
   case COUNTRY:
    setter.setString(QuizCategory.COUNTRY.toString());
    break;
   case PROVERB:
    setter.setString(QuizCategory.PROVERB.toString());
    break;
   case RIDDLE:
    setter.setString(QuizCategory.RIDDLE.toString());
    break;
   case TEXTBOOK:
    setter.setString(QuizCategory.TEXTBOOK.toString());
    break;
   case TV:
    setter.setString(QuizCategory.TV.toString());
    break;
   default:
    throw new SQLException("Unexpceted value found. " + QuizCategory.class.toString() + " was expected.");
  }
 }
 @Override
 public Object valueOf(String str) {
  if (StringUtils.equals(QuizCategory.COMMON.toString(), str)) {
   return QuizCategory.COMMON;
  } else if (StringUtils.equals(QuizCategory.COUNTRY.toString(), str)) {
   return QuizCategory.COUNTRY;
  } else if (StringUtils.equals(QuizCategory.PROVERB.toString(), str)) {
   return QuizCategory.PROVERB;
  } else if (StringUtils.equals(QuizCategory.RIDDLE.toString(), str)) {
   return QuizCategory.RIDDLE;
  } else if (StringUtils.equals(QuizCategory.TEXTBOOK.toString(), str)) {
   return QuizCategory.TEXTBOOK;
  } else if (StringUtils.equals(QuizCategory.TV.toString(), str)) {
   return QuizCategory.TV;
  }
  return null;
 }
}

2010년 8월 5일 목요일

Unitils와 DBUnit 에서 NoSuchColumnException 에러

분명히 DB에 컬럼이 존재함에도 불구하고

Unitils에서 DBUnit를 연동해서 dataset의 내용을 처리할때

아래와 같은 에러가 발생할 경우가 있다.

 

org.dbunit.dataset.NoSuchColumnException

 

이것은 라이브러리 버전의 문제일수도 있다.

 

DBUnit 2.4.7 과 Untils- DBUnit 3.1을 사용했더니 위의 문제가 발생되었다.

DBUnit 의 버전을 2.2.2 로 내리고 나니 해결이 되었다.

(pom.xml에서 빼면 자동으로 2.2.2를 포함한다)

2010년 8월 4일 수요일

java.lang.NoSuchMethodError 에러메시지

간혹 NoSuchMethodError가 발생할 경우가 있다.

 

메소드를 찾지 못해서 발생하는 에러인데

코드상, 라이브러리상에서 전혀 문제가 없는 경우 발생할 때에는

 

주로 classpath상에서 중복되는 class가 있어서 정상적으로 method를

찾지 못해서 발생하는 문제이므로 아래와 같이 조치를 해보자

  1. lib폴더에서 중복되는 jar파일의 존재를 확인한다
  2. maven의 pom.xml파일에서 dependency 부분에서 complict가 발생되는 라이브러리가

    없는지 확인해보도록 하자

 

2010년 7월 25일 일요일

Ant의 FileSet을 Source 이용하기

Apache의 Ant에서는 FileSet라는 파일 및 폴더 관리 방식이 있다.

 

매우 유연하게 폴더 및 파일을 접근할 수 있는데 그부분은 Java 소스에서

 

이용하는 방법을 알아보도록 하자.

 

예제1

  String fileSet = "**/F*.jsp,**/T*.jsp";
  String fileSetExclude = "**/S.jsp";
  File ws = new File("D:/Projects/lucy/text-finder/work/jobs/Test/workspace");
 
        FileSet fs = new FileSet();
        org.apache.tools.ant.Project p = new org.apache.tools.ant.Project();
        fs.setProject(p);
        fs.setDir(ws);  // Root경로를 지정
        fs.setIncludes(fileSet);  //포함할 파일 조건
        fs.setExcludes(fileSetExclude);  //제외할 파일 조건
        DirectoryScanner ds = fs.getDirectoryScanner(p);

        // Any files in the final set
        String[] files = ds.getIncludedFiles();
        if (files.length == 0) {
         System.err.println("FileSet Empty");
            throw new Exception();
        }

        for (String file : files) {
            File f = new File(ws, file);
            if (!f.exists()) {
             System.err.println("Error Find File : " + f);
                continue;
            }
            if (!f.canRead()) {
             System.err.println("Error Read File : " + f);
                continue;
            }
           
            System.out.println("File : " + f.getName());
           
        }

 

 

위의 소스가 간단하기 때문에 쉽게 파악할 수 있을것이다.

 

FileSet의 조건을 주는 방식은 ant의 설명을 참고하길 바라며 콤마(,)를 이용해 다수의 경로조건을 입력할 수 있다.


 

2010년 7월 19일 월요일

IEToy에서 네이버 불펌 방지 해지

네이버에서 블로그나 카폐등을 돌아 다니다 보면 불펌 방지가 되어 있는 글을 볼 수 있다.

 

필요한 내용이 있을 경우, 특히 소스 등의 경우 타이핑으로 복사하는건 너무 힘든일이다.

 

이런 불편을 IEToy에서 해결 하기 위한 방법을 설명해보겠다.

 

 1. http://userscripts.org/scripts/show/61326  에 install버튼을 클릭한다.

 

 2. 파일 이름을 antidisablerfornaver.user.js 로 변경해서 IEToy설치 폴더의 gmm_Scripts폴더에 이동한다.

 

 3. IEToy 환경 설정(Win+I)에서 사용사 스크립트 항목에서 "Anti-Disable for Naver"을 체크한다.

 

 4. 위의 사이트가 문제가 있을 경우 아래의 링크를 다운받아서 2~3번의 절차를 거친다.

 

Spring Test Context Framework 사용시 Type mismatch 에러

TDD기반의 프로그래밍 중 스프링의 IC를 사용할때 Spring TestContext Framework를 사용하게 된다.

 

그럴 때 편의를 위해서 어노테이션을 사용하게 되는 경우가 많은데

 

아래와 같이 테스트용 메소드 상단에 기록을 하는 것이 일반적이다.

 

@RunWith(SpringJUnit4ClassRunner.class)
// specifies the Spring configuration to load for this test fixture
@ContextConfiguration(locations={"daos.xml"})
public final class HibernateTitleDaoTests {

    // this instance will be dependency injected by type
    @Autowired   
    private HibernateTitleDao titleDao;

    public void testLoadTitle() throws Exception {
        Title title = this.titleDao.loadTitle(new Long(10));
        assertNotNull(title);
    }
}


그런데 이렇게 설정을 해놓고 실행시에 아래와 같은 오류가 발생할 경우에는

 

Type mismatch: cannot convert from Class<SpringJUnit4ClassRunner> to Class<? extends Runner>

 

설치된 JUnit 의 버전을 확인 해보자.

 

JUnit 4.4 이후의 버전을 사용하게 되면 위의 오류는 사라질 것이다.

 

설치된 JUnit 의 버전을 확인 해보자.

 

 

 

또한 위와 같이 Autowire를 설정시에는 꼭 ApplicationConext.xml 파일의 beans 설정에 defalt-autowire속성이 설정되었는지 확인해야 한다.

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" ... 중략 ...  default-autowire="byName">
 <bean id="boardDAO" class="com.naver.bbs.dao.BoardDAOImpl" />
</beans>


 

 

 

 

Eclipse Code Template 에서 ${user}변수 변경

Eclipse(이클립스) 사용시 Code Template(코드 템플릿)에서 유저명을 변수로 사용할 수 있다.

 

예)

/**
 * @author ${user}
 */


그런데 간혹 이 유저명이 내가 현재 원하는 유저명이 아닌 OS유저명이 적용되는 것을 볼 수 있다.

 

이것을 변경하기 위해서는 이클립스가 설치된 경로의 설정파일에 다음의 한줄을 추가하자

 

eclipse.ini


-Duser.name="사용하고자하는 유저명"