programing

@문자열에서 정수로의 값 주석 유형

muds 2023. 3. 12. 11:24
반응형

@문자열에서 정수로의 값 주석 유형

값의 출력을 정수로 변환하려고 합니다.

@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

반응형