programing

문자열에서 정수로 @Value 주석 유형 캐스팅

projobs 2021. 1. 15. 07:30
반응형

문자열에서 정수로 @Value 주석 유형 캐스팅


값의 출력을 정수로 캐스팅하려고합니다.

@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}")

구글은이 주제에 대해 많이 말하지 않는 것 같다. 이 값이 사용되는 모든 곳에서 구문 분석하는 대신 항상 정수를 처리하고 싶습니다.

해결 방법

해결 방법은 setter 메서드를 사용하여 변환을 실행하는 것임을 알고 있지만 Spring이 할 수 있다면 Spring에 대해 배우고 싶습니다.


다음을 포함하는 클래스 경로에 속성 파일이 있다고 가정합니다.

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;

당신은 변환 할 경우 속성을정수 특성 파일에서가 2 개 내가 찾은 솔루션은 :

주어진 시나리오 : customer.propertiescustomer.id = 100 을 필드로 포함 하고 spring 구성 파일에서 integer 로 액세스하려고합니다 . customerId 속성 은 Bean Customer 에서 int 유형으로 선언됩니다 .

해결책 1 :

<property name="customerId" value="#{T(java.lang.Integer).parseInt('${customer.id}')}" />

위의 줄 에서 속성 파일 문자열 값은 int 유형으로 변환됩니다 .

솔루션 2 :의 다른 확장 인플레 이스 propeties .FOR 전 약혼자 당신의 재산 파일 이름 인 경우 customer.properties는 다음 만들 customer.details 코드 아래의 구성 파일 사용

<property name="customerId"  	value="${customer.id}" />


나는 똑같은 상황을 겪었습니다. 이는 Spring 컨텍스트에 PropertySourcesPlaceholderConfigurer 가 없기 때문에 발생하며 @Value클래스 내부의 주석 에 대한 값을 확인합니다 .

문제를 해결하기 위해 속성 자리 표시자를 포함하고 정수에 Spring 표현식을 사용할 필요가 없습니다 (를 사용하는 경우 속성 파일이 존재하지 않아도 됨 ignore-resource-not-found="true").

<context:property-placeholder location="/path/to/my/app.properties"
    ignore-resource-not-found="true" />

@Configuation을 사용하는 경우 정적 빈 아래에서 인스턴스화하십시오. 정적이 아닌 경우 @Configutation은 매우 일찍 인스턴스화되고 @Value, @Autowired 등과 같은 어노테이션을 해결하는 BeanPostProcessor는 이에 대해 조치를 취할 수 없습니다. 여기를 참조 하십시오

@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
   return new PropertySourcesPlaceholderConfigurer();
}

나는 이것을 사용하여 해결 한 동일한 문제가있었습니다. * .properties 파일에 정의 된 int 값을 얻으려면Spring MVC : @Value 주석을 참조하십시오 .

@Value(#{propertyfileId.propertyName})

공장


이 문제는 동일한 파일 이름을 가진 두 개의 리소스가있는 경우에도 발생합니다. 2 개의 다른 jar 또는 클래스 경로 내에 구성된 디렉토리 경로 내에서 "configurations.properties"라고 말하십시오. 예를 들면 :

You have your "configurations.properties" in your process or web application (jar, war or ear). But another dependency (jar) have the same file "configurations.properties" in the same path. Then I suppose that Spring have no idea (@_@?) where to get the property and just sends the property name declared within the @Value annotation.


In my case, the problem was that my POST request was sent to the same url as GET (with get parameters using "?..=..") and that parameters had the same name as form parameters. Probably Spring is merging them into an array and parsing was throwing error.


when use @Value, you should add @PropertySource annotation on Class, or specify properties holder in spring's xml file. eg.

@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

this works!

Of course, you can use placeholder xml configuration instead of annotation. spring.xml

<context:property-placeholder location="classpath:config.properties"/>

ReferenceURL : https://stackoverflow.com/questions/15394351/value-annotation-type-casting-to-integer-from-string

반응형