@문자열에서 정수로의 값 주석 유형
값의 출력을 정수로 변환하려고 합니다.
@Value("${api.orders.pingFrequency}")
private Integer pingFrequency;
위의 에러가 발생합니다.
org.springframework.beans.TypeMismatchException:
Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer';
nested exception is java.lang.NumberFormatException:
For input string: "(java.lang.Integer)${api.orders.pingFrequency}"
나도 해봤어@Value("(java.lang.Integer)${api.orders.pingFrequency}")
구글은 그 주제에 대해 많은 말을 하지 않는 것 같다.사용되는 모든 곳에서 이 값을 구문 분석할 필요 없이 항상 정수를 다루고 싶습니다.
회피책
세터 방식을 사용하여 변환을 실행하는 것이 회피책일 수도 있다는 것을 알지만, 스프링이 변환 작업을 수행할 수 있다면 스프링에 대해 좀 더 알고 싶습니다.
클래스 패스에 다음과 같은 속성 파일이 있다고 가정합니다.
api.orders.pingFrequency=4
나는 안에서 시도했다.@Controller
@Controller
public class MyController {
@Value("${api.orders.pingFrequency}")
private Integer pingFrequency;
...
}
다음이 포함된 서블릿 컨텍스트:
<context:property-placeholder location="classpath:myprops.properties" />
완벽하게 작동했다.
따라서 속성이 정수 유형이 아니거나 속성 자리 표시자가 올바르게 구성되지 않았거나 잘못된 속성 키를 사용하고 있습니다.
잘못된 속성 값으로 실행하려고 했습니다.4123;
제가 받은 예외는
java.lang.NumberFormatException: For input string: "4123;"
당신 재산의 가치는
api.orders.pingFrequency=(java.lang.Integer)${api.orders.pingFrequency}
인터넷에서 답을 찾다가 다음과 같은 것을 발견했습니다.
@Value("#{new java.text.SimpleDateFormat('${aDateFormat}').parse('${aDateStr}')}")
Date myDate;
그래서 당신의 경우 이걸로 시도해 보세요.
@Value("#{new Integer('${api.orders.pingFrequency}')}")
private Integer pingFrequency;
나도 똑같은 상황이었어.이는 스프링 컨텍스트에 PropertySourcesPlaceholderConfigr이 없기 때문에 발생합니다.이것에 의해, Spring 콘텍스트에 대해서 값이 해결됩니다.@Value
클래스 내 주석.
문제를 해결하기 위해 속성 자리 표시자를 포함합니다. 정수에는 스프링 식을 사용할 필요가 없습니다(속성 파일을 사용할 경우 속성 파일이 존재할 필요가 없습니다).ignore-resource-not-found="true"
):
<context:property-placeholder location="/path/to/my/app.properties"
ignore-resource-not-found="true" />
속성을 속성 파일에서 정수로 변환하려면 다음 두 가지 솔루션이 있습니다.
지정된 시나리오: customer.properties에는 customer.id = 100이 필드로 포함되어 있으며 스프링 구성 파일에서 정수로 액세스하려고 합니다.빈 고객에서 속성 customerId가 유형 int로 선언되었습니다.
해결책 1:
<property name="customerId" value="#{T(java.lang.Integer).parseInt('${customer.id}')}" />
위 행에서는 속성 파일의 문자열 값이 int 유형으로 변환됩니다.
해결책 2: 프리스타일 대신 다른 확장을 사용합니다.예: 속성 파일 이름이 customer.properties인 경우 customer.details로 하고 구성 파일에서 다음 코드를 사용합니다.
<property name="customerId" value="${customer.id}" />
@Configuration을 사용하는 경우 static bean 아래에서 인스턴스화합니다.정적인 @Configuration이 매우 빨리 인스턴스화되지 않으면 @Value, @Autowired 등의 주석을 해결하는 BeanPostProcessors는 이에 대응할 수 없습니다.여기를 참조해 주세요.
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
나는 이것을 사용하여 해결한 것과 같은 문제가 있었다.*.properties 파일에 정의된 int 값을 얻으려면 이번 봄 MVC: @Value 주석을 참조하십시오.
@Value(#{propertyfileId.propertyName})
작동하다
@Value를 사용하는 경우 Class에 @PropertySource 주석을 추가하거나 spring의 xml 파일에 속성 홀더를 지정해야 합니다.예:
@Component
@PropertySource("classpath:config.properties")
public class BusinessClass{
@Value("${user.name}")
private String name;
@Value("${user.age}")
private int age;
@Value("${user.registed:false}")
private boolean registed;
}
config.properties
user.name=test
user.age=20
user.registed=true
이거 되는구나!
물론 annotation.spring.xml 대신 플레이스 홀더 xml 구성을 사용할 수 있습니다.
<context:property-placeholder location="classpath:config.properties"/>
이 문제는 동일한 파일 이름을 가진 리소스가 2개 있는 경우에도 발생합니다.예를 들어 클래스 경로 내에 설정된2개의 다른 jar 또는 디렉토리 경로 내에 "configurations.properties"라고 입력합니다.예를 들어 다음과 같습니다.
프로세스 또는 웹 애플리케이션(jar, war 또는 ear)에 "configurations.properties"가 있습니다.그러나 다른 의존관계(jar)는 같은 경로에 동일한 파일 "configurations.properties"를 가지고 있습니다.그러면 Spring은 속성을 어디서 가져올지(@_@?) 모르고 @Value 주석 내에서 선언된 속성 이름을 보냅니다.
제 경우, POST 요청이 GET와 같은 URL로 전송되고('?..=..'를 사용한 get 파라미터가 폼 파라미터와 이름이 같다는 것이 문제였습니다.아마도 Spring이 그것들을 배열에 병합하고 해석하는 중 오류가 발생했을 것입니다.
cast와 함께 @Value("new Long("myconfig")")를 사용하면 Configuration을 찾을 수 없거나 예상되는 숫자 형식이 다를 경우 부팅 시 오류가 발생할 수 있습니다.
이하의 어프로치를 채용해, Fail Safe Check로 기대대로 동작하고 있습니다.
@Configuration()
public class MyConfiguration {
Long DEFAULT_MAX_IDLE_TIMEOUT = 5l;
@Value("db.timeoutInString")
private String timeout;
public Long getTimout() {
final Long timoutVal = StringUtil.parseLong(timeout);
if (null == timoutVal) {
return DEFAULT_MAX_IDLE_TIMEOUT;
}
return timoutVal;
}
}
언급URL : https://stackoverflow.com/questions/15394351/value-annotation-type-casting-to-integer-from-string
'programing' 카테고리의 다른 글
Wordpress에서 관리 메뉴 항목 숨기기 (0) | 2023.03.12 |
---|---|
Google API에 jQuery Post를 보내는 동안 Access-Control-Allow-Origin 오류가 발생했습니다. (0) | 2023.03.12 |
"JSX 요소에 암묵적으로 "임의" 유형의 오류가 있습니다."를 해결하는 방법 (0) | 2023.03.12 |
Oracle SQL 삽입 With 절 (0) | 2023.03.12 |
워드프레스 포스트 루프 show post_name / slug (0) | 2023.03.12 |