톰캣 (Tomcat)을 웹 (Web)으로 배포 (Deploy)할 때 다음과 같은 예외가 발생할 수 있다.


HTTP Status 500 - org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (59058623) exceeds the configured maximum (52428800)


manager 애플리케이션 (Application)이 파일 업로드 크기를 50MB로 제한해두었기 때문이다.


webapps/manager/WEB-INF/web.xml 파일의 다음을 원하는 크기로 변경하면 된다.


    <multipart-config>

      <!-- 50MB max -->

      <max-file-size>52428800</max-file-size>

      <max-request-size>52428800</max-request-size>

      <file-size-threshold>0</file-size-threshold>

    </multipart-config>


Reference:

http://maxrohde.com/2011/04/27/large-war-file-cannot-be-deployed-in-tomcat-7/

Posted by izeye

댓글을 달아 주세요

commons-httpclient 사용 시 다음 예외에 직면할 수 있다.


java.lang.RuntimeException: java.net.BindException: Address already in use


HTTP 커넥션 (Connection)을 다음과 같이 릴리즈 (Release)해줘야만 한다.


method.releaseConnection();


물론 릴리즈하더라도 순간 커넥션 연결 개수가 포트 범위를 넘어서면 동일한 예외가 발생할 수 있다.

Posted by izeye

댓글을 달아 주세요

레퍼런스 (Reference) 대로 다음과 같이 하면,


@Entity

@Table(name = "tb_load_test_result", uniqueConstraints = @UniqueConstraint(columnNames = {

"testId", "hostname", "timestamp" }))

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

@DiscriminatorColumn

@DiscriminatorValue("L")

public class LoadTestResult {


@Entity

@Table(name = "tb_load_test_result")

@DiscriminatorValue("S")

public class SomeLoadTestResult extends LoadTestResult {


다음과 같은 경고에 직면할 수 있다.


WARN : org.hibernate.cfg.AnnotationBinder - HHH000139: Illegal use of @Table in a subclass of a SINGLE_TABLE hierarchy: com.izeye.test.domain.SomeLoadTestResult


SomeLoadTestResult 클래스에서 @Table 애노테이션 (Annotation)을 제거하면 해결된다.


Reference:

http://viralpatel.net/blogs/hibernate-inheritence-table-per-hierarchy-mapping/

Posted by izeye

댓글을 달아 주세요

스프링 @Scheduled cron으로 매초 설정했을 때


한 서버에서는 잘 동작하는데


다른 서버에서는 잘 동작하다가 갑자기 3초 혹은 4초가 걸리는 문제가 있었다.


두 서버의 스펙은 동일하다.


별별 문제 시나리오를 생각하고 테스트해봤지만 답을 찾지 못하다가


혹시나 자바 버전이 문제일까해서


1.6.0_18을 1.6.0_24로 변경하니 문제가 해소되었다.


헐.


진작에 자바를 의심할껄.


@Scheduled cron이 ScheduledThreadPoolExecutor를 사용하니


해당 버전에서 ScheduledThreadPoolExecutor를 사용하면 문제가 발생할 듯 싶다.


이걸로 하루를 날려먹...

Posted by izeye

댓글을 달아 주세요

메이븐 (Maven) 실행 시 다음과 같은 에러에 직면할 수 있다.


Error resolving version for 'org.apache.maven.plugins:maven-shade-plugin': Plugin requires Maven version 3.0


다음과 같이 메이븐 버전을 확인할 수 있다.


mvn -v


메이븐 최신 버전을 설치하면 해결된다.

Posted by izeye

댓글을 달아 주세요

commons-fileupload 1.3 버전에 DoS 취약성이 발견되어 1.3.1로 패치해야만 한다.


다음 명령으로 확인할 수 있다.


sudo /usr/sbin/lsof | grep fileupload


젠킨스도 commons-fileupload-1.2.1.jar에 의존성을 가지고 있어 패치 대상이다.


하지만 잘 생각해보자.


젠킨스는 보통 내부망에 존재한다.


고로 젠킨스가 공격받는다고 하면 내부망이 노출되었기 때문에 이미 치명적인 상황이다.


젠킨스의 용도에 따라 다르겠지만,


DoS 공격으로 서비스 못하는 상태가 된다고 크게 문제가 되지는 않는다.


하지만 정책 상 강제하면 피곤하지만 해야지 어쩌겠는가?


CentOS에 yum으로 간단히 설치해서 좋다고 했는데 대략 급 피곤해지는 상황이다.


우선 다음과 같이 젠킨스 소스를 받아서 이클립스 프로젝트화해야만 한다.


http://devday.tistory.com/entry/%EC%A0%A0%ED%82%A8%EC%8A%A4-Jenkins-%EC%86%8C%EC%8A%A4-Source-%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4-Eclipse-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A1%9C-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0


jenkins-core 프로젝트가 commons-fileupload에 대한 디펜던시를 가지고 있기 때문에


pom.xml에 다음을 추가한다.


<dependency>

 <groupId>commons-fileupload</groupId>

 <artifactId>commons-fileupload</artifactId>

 <version>1.3.1</version>

</dependency>


슬프게도 삽질은 여기에서 끝나지 않는다.


commons-fileupload의 하위 호환성 (Backward Compatibility) 문제로


hudson.model.FileParameterValue의 FileItemImpl 정적 내부 클래스 (Static Inner Class)에 다음을 추가한다.


@Override

public FileItemHeaders getHeaders() {

throw new UnsupportedOperationException();

}


@Override

public void setHeaders(FileItemHeaders headers) {

throw new UnsupportedOperationException();

}


war 파일을 생성해서 재배포하면 된다.


Reference:

http://commons.apache.org/proper/commons-fileupload/changes-report.html

Posted by izeye

댓글을 달아 주세요

메이븐 (Maven) 실행 시 다음과 같은 에러 (Error)에 직면할 수 있다.


[ERROR] PermGen space -> [Help 1]

[ERROR] 

[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.

[ERROR] Re-run Maven using the -X switch to enable full debug logging.

[ERROR] 

[ERROR] For more information about the errors and possible solutions, please read the following articles:

[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/OutOfMemoryError


Help 1의 링크에 있는대로 다음과 같이 Perm 영역의 크기를 늘려주면 해결된다.


export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=128m"

Posted by izeye

댓글을 달아 주세요

다음 테스트 실행 시,


import java.io.IOException;


import org.junit.Test;


import com.fasterxml.jackson.core.JsonParseException;

import com.fasterxml.jackson.databind.JsonMappingException;

import com.fasterxml.jackson.databind.ObjectMapper;


public class ObjectMapperTest {


@Test

public void readValue() throws JsonParseException, JsonMappingException,

IOException {

ObjectMapper mapper = new ObjectMapper();

String content = "{\"name\": \"Johnny\"}";

TestClass testClass = mapper.readValue(content, TestClass.class);

System.out.println(testClass);

}


class TestClass {

private String name;


public String getName() {

return name;

}


public void setName(String name) {

this.name = name;

}


@Override

public String toString() {

return "TestClass [name=" + name + "]";

}

}


}


다음과 같은 예외에 직면할 수 있다.


com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class ObjectMapperTest$TestClass]: can not instantiate from JSON object (need to add/enable type information?)


TestClass에 static을 붙여주면 해결된다.

Posted by izeye

댓글을 달아 주세요

실행 중 다음과 같은 에러에 직면할 수 있다.


java.lang.NoSuchMethodError: java.lang.Integer.compare(II)I


JDK 1.7에만 존재하는 Integer의 다음 메소드 (Method)를 참조해서 발생한 문제이다.


public static int compare(int x, int y)


JDK 1.7로 업그레이드할 수 없다면,


다음과 같이 NumberUtils를 만들어서 사용하면 되겠다.


public class NumberUtils {


public static int compare(int x, int y) {

return (x < y) ? -1 : ((x == y) ? 0 : 1);

}


}

Posted by izeye

댓글을 달아 주세요

자바에서 유니코드 파일 처리 시 BOM 때문에 삽질할 수 있다.


특별한 방법이 없는 듯하다.


다음과 같이 수작업으로 처리할 수 있겠다.


private static final char BOM = 0xfeff;


// NOTE:

// Handle BOM.

String line = br.readLine();

if (!line.isEmpty() && line.charAt(0) == BOM) {

line = line.substring(1);

}


Reference:

http://stackoverflow.com/questions/15985889/right-way-to-deal-with-unicode-bom-in-a-text-file

Posted by izeye

댓글을 달아 주세요