springboot 1.5.10에서 springboot 2.0.0으로 올리면서 한 삽질.


1. SpringBootServletInitializer 패키지 이름이 바뀜

import org.springframework.boot.web.support.SpringBootServletInitializer;

->

import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;



2. WebMvcConfigurerAdapter deprecated

public class CustomWebMvcConfig extends WebMvcConfigurerAdapter

->

public class CustomWebMvcConfig implements WebMvcConfigurer



3. JPA method  findOne -> findById or getOne

ID를 가지고 Domain을 가져오는 method로 findOne을 썻다면 

getOne 또는 findById로 변경.


주의할점 : findById는 return값을 Optional<T>로 리턴. 


'java' 카테고리의 다른 글

Spring Filter 순서 설정.  (0) 2018.01.11
Json 응답시 Null값을 ""으로 자동으로 바꾸기.  (0) 2017.06.21
RestTemplate Urlcoding 삽질기..  (0) 2016.07.08
Spring RestTemplate timeout 설정  (0) 2016.05.30
log4j 설정  (0) 2016.04.06
Posted by 무세1
,

Spring Filter 순서 설정.

java 2018. 1. 11. 00:40

Springboot를 이용해서 프로젝트 진행중에 CORS Filter와 인증용 Auth Filter를 만들었다.


필터가 실행되는 순서를

CORS 실행후 Auth 필터를 실행하고 싶었다. 


FilterRegisterBean을 통해 순서를 실행하는 방법도 있지만,  

@Order Annotation을 통해서 간단히 설정할수 있었다.


@Component

@Order(1)

public class CorsFilter implement Filter {

..........

}


@Component

@Order(2)

public class AuthFilter implement Filter {

..........

}



Posted by 무세1
,

Spring에서 RestController를 이용해서 Json으로 응답을 주고 있는데, 모든 API에 대해서 Null값은 "" 으로 바꿔줘야 했다.


응닶값이 Null이면 제거해 주는 Annotation은 존재하지만 공백으로 바꿔주는 Annotation은 존재하지 않는다.

 @JsonInclude(Include.NON_NULL) -> Null을 제거해 주는 Annotation


그래서 몇가지 Custom을 통해서 해결이 가능하다.


JsonSerializer 클래스를 상속받아 serialize method를 override한다.

import com.fasterxml.jackson.core.JsonGenerator;

import com.fasterxml.jackson.core.JsonProcessingException;

import com.fasterxml.jackson.databind.JsonSerializer;

import com.fasterxml.jackson.databind.SerializerProvider;


import java.io.IOException;


public class NullToEmptyStringSerializer extends JsonSerializer<Object>{


    @Override

    public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {

        jsonGenerator.writeString("");

    }

}


그리고 ObjectMapper를 Custom한다.

import com.fasterxml.jackson.databind.ObjectMapper;


public class CustomObjectMapper extends ObjectMapper {


    private static final long serialVersionUID = 1L;


    public CustomObjectMapper(){

        getSerializerProvider().setNullValueSerializer(new NullToEmptyStringSerializer());

    }


}


Springboot를 이용하기 때문에 JavaConfig로 설정 하겠다.


그 이후에 MappingJackson2HttpMessageConverter 클래스에 CustumObjectMapper를 설정해 주면 된다.

@Configuration

public class JsonCustomConfigure {

    @Bean

    public MappingJackson2HttpMessageConverter converter() {

        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();

        CustomObjectMapper mapper = new CustomObjectMapper();

        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        converter.setObjectMapper(mapper);

        return converter;

    }

}


'java' 카테고리의 다른 글

springboot 1.5.x 에서 springboot 2.0.x 넘어가면서 생긴일..  (0) 2018.03.12
Spring Filter 순서 설정.  (0) 2018.01.11
RestTemplate Urlcoding 삽질기..  (0) 2016.07.08
Spring RestTemplate timeout 설정  (0) 2016.05.30
log4j 설정  (0) 2016.04.06
Posted by 무세1
,


RestTemplate는 자동으로 URLEcoding을 해준다.


GET방식으로 아래 URL호출시에... 특수문자 '=' URLEncoding을 해줄필요가 없다..

RestTemplate에서느 자동으로 해준다. 


http://localhost:9999/test?param=test=


RestTemplate restTemplate = new RestTemplate();

String result = restTemplate.getForObject("http://localhost:9999/test?param=test=", String.class);


'java' 카테고리의 다른 글

Spring Filter 순서 설정.  (0) 2018.01.11
Json 응답시 Null값을 ""으로 자동으로 바꾸기.  (0) 2017.06.21
Spring RestTemplate timeout 설정  (0) 2016.05.30
log4j 설정  (0) 2016.04.06
JPA 사용시 특정 컬럼만 UPDATE 하는 방법..  (0) 2016.04.01
Posted by 무세1
,

RestTemplate 생성 시 Timeout 설정 방법.


// Connection Timeout 10초, ReadTimeout 10초 설정.

private RestTemplate getRestTemplate() {
HttpComponentsClientHttpRequestFactory factory 

= new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(10*1000);
factory.setReadTimeout(10*1000);
RestTemplate restTemplate = new RestTemplate(factory);
return restTemplate;
}



Posted by 무세1
,

log4j 설정

java 2016. 4. 6. 11:26

간단한 배치 프로그램을 만들었는데... log를 찍기 위해 log4j를 maven dependency에 추가 했다.


batch.jar를 만들어서 콘솔에서 java -jar batch.jar 로 실행을 했다.


java -jar batch.jar


log4j:WARN No appenders could be found for logger (com.BatchMain).

log4j:WARN No appenders could be found for logger.


빨간색의 오류가 발생됬다. 

log4j.properties 파일은 jar파일에 포함되어 있다.


해결책은  -Dlog4j.configuration 옵션을 주면 해결이 된다.


> java -Dlog4j.configuration=properties/log4j.properties -jar batch.jar


jar에 묶여있지 않고, file을 참조 하려면

> java -Dlog4j.configuration=file:/root/properties/log4j.properties -jar batch.jar


'java' 카테고리의 다른 글

RestTemplate Urlcoding 삽질기..  (0) 2016.07.08
Spring RestTemplate timeout 설정  (0) 2016.05.30
JPA 사용시 특정 컬럼만 UPDATE 하는 방법..  (0) 2016.04.01
서버 Hostname 가져오기..  (0) 2016.03.09
Java 8 날짜 정리  (0) 2015.12.17
Posted by 무세1
,

기본적으로 JPA를 사용하면 update시 PK를 제외한 전체 컬럼을 업데이트 한다.


Oracle의 경우 테이블 파티션을 나누는데, 

파티션의 키가 되는 컬럼을 업데이트 할때 partition move가 되는 경우 오류가 발생한다.


개발DB는 보통 파티션을 하지 않거나, 파티션 무브를 허용하지만, 

운영DB는 보통 파티션 무브를 허용하지 않는다고 한다... 


운영파티션무브를 허용하거나, 

또는

Domain에 다음과 같이 어노테이션을 추가하여 변경된 컬럼만 업데이트 하도록 하여 해결하면 된다.

@org.hibernate.annotations.DynamicUpdate



@Entity

@org.hibernate.annotations.DynamicUpdate

public class Member {

@id

private long id;

private String name;

..

..

}


'java' 카테고리의 다른 글

Spring RestTemplate timeout 설정  (0) 2016.05.30
log4j 설정  (0) 2016.04.06
서버 Hostname 가져오기..  (0) 2016.03.09
Java 8 날짜 정리  (0) 2015.12.17
java.sql.SQLRecoverableException: IO Error: Connection reset 오류 해결  (0) 2015.11.30
Posted by 무세1
,


서버에 Hostname이 설정이 되어 있다면 아래와 같이 불러올 수 있다.

System.getenv("HOSTNAME");


설정이 되어 있지 않다면....

public static String getHostName(){
String hostname = System.getenv("HOSTNAME");
if(hostname != null) return hostname;

String lineStr = "";
try {
Process process = Runtime.getRuntime().exec("hostname");
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
while((lineStr = br.readLine()) != null ){
hostname = lineStr;
}
}catch (IOException e) {
e.printStackTrace();
hostname = "";
}
return hostname;
}


Posted by 무세1
,

Java 8 날짜 정리

java 2015. 12. 17. 10:58

http://jekalmin.tistory.com/entry/%EC%9E%90%EB%B0%94-18-%EB%82%A0%EC%A7%9C-%EC%A0%95%EB%A6%AC

위 URL 참조.





Posted by 무세1
,

1. 현상

springboot+springbatch 조합으로 배치 프로그램 작성

실행파일 jar를 만들어서 배치를 아래와 같이 실행. 

java -Dspring.profile.active=real -jar test-batch.jar batch01


crontab으로 스케쥴링

1시간마다 배치 실행시 오류 발생하지 않음.

5분마다 배치 실행시 첫 배치는 잘 실행 되나, 그 이후에 랜덤하게 오류 발생.


오류내용 java.sql.SQLRecoverableException: IO Error: Connection reset



2. 문제해결

실행시 다음 옵션을 줘서 해결함.(-Djava.security.egd=file:///dev/urandom)

java -Dspring.profile.active=real -Djava.security.egd=file:///dev/urandom -jar test-batch.jar batch01



3. 원인


11g JDBC 드라이버는 사용시 connect string을 암호화하기 위해서 /dev/random을 이용 40bytes의 난수를 생성하여 connect string을 암호화 하는데 /dev/random은 변동(noise)이 적은 시스템에서는 난수 생성이 중단(block)된다 는 문제점이 발생 (참조 2.1, 2.2) /dev/random의 OS level문제 때문에 시스템이 조용하면 /dev/random이용한 난수 생성이 원활하지 않고, 난수생성이 안되어 11g JDBC사용을 필요로 할때 noise가 적어 /dev/random으로부터 40byte의 난수를 얻지 못한 JDBC는 connect string을 암호화 하지 못하고 암호화가 되지 않아 디비접속을 못해서 JDBC사용시 접속불가 장애가 발생한 것으로 확인이 됨.


urandom은 random과 달리 entropy pool 상황에 상관없이 난수생성이 되므로 JDBC드라이버 사용시 혹은 WAS 구동시 명시적으로 -Djava.security.egd=file:///dev/urandom 이라는 자바옵션을 부여하여 (참조 1.1)


/dev/random 대신 /dev/urandom을 강제적으로 사용을 하면 시스템 noise가 없어도 항상 난수 생성이 되어 JDBC를 이용한 접속시 문제가 발생하지 않음


출처 :

http://opendatabase.tistory.com/entry/WAS-%EC%97%90%EC%84%9C-DB%EB%A1%9C-%EC%A0%91%EC%86%8D-%EB%B6%88%EA%B0%80-javasqlSQLRecoverableException-IO-Error-Connection-reset




'java' 카테고리의 다른 글

서버 Hostname 가져오기..  (0) 2016.03.09
Java 8 날짜 정리  (0) 2015.12.17
springboot connection pool 설정  (0) 2015.10.22
maven build 할때 mapper.xml 누락되는 현상  (0) 2015.03.05
spring mysql datasouce  (0) 2015.02.08
Posted by 무세1
,