2013-03-25 2 views
1

나는 Spring이이 질문에 반드시 필요하다는 것을 지적해야하지만 Spring을 사용하는 동안이 문제가 발생하여 Spring의 상황을 사용합니다. 나는 이것을 만났다.문자열 배열 "상수"를 Spring에서 사용하기 @RequestMapping 값

특정 양식의 동일한 URL 집합에 GETPOST 요청에 대한 요청을 매핑하는 컨트롤러 클래스가 있습니다. 이 양식에는 각기 다른 로케일에 대한 URL이 있지만 양식의 컨트롤러 레벨 논리가 각 로케일 사이트마다 동일하기 때문에 GET 요청에 대해서는 하나의 방법 만 있고 POST에 대해서는 하나의 방법 만 있습니다 (그러나 논리가 깊을수록, 로케일 별 유효성 검사와는 다를 수 있음). 예 :

@Controller 
public class MyFormController { 

    // GET request 
    @RequestMapping(value={"/us-form.html", "/de-form.html", "/fr-form.html"}, 
      method={RequestMethod.GET}) 
    public String showMyForm() { 
     // Do some stuff like adding values to the model 
     return "my-form-view"; 
    } 

    // POST request 
    @RequestMapping(value={"/us-form.html", "/de-form.html", "/fr-form.html"}, 
      method={RequestMethod.POST}) 
    public String submitMyForm() { 
     // Do stuff like validation and error marking in the model 
     return "my-form-view"; // Same as GET 
    } 
} 

형태 GETPOST 작품과 같이 작성하면 잘. @RequestMapping 값에 사용 된 String 배열이 동일한 것을 알 수 있습니다. 내가하고 싶은 일은 해당 URL을 하나의 자리 (이상적으로는 컨트롤러의 static final 입력란)에 넣는 것입니다. 그러면 나중에 URL이 추가 될 때 한 곳에서 추가 할 수 있습니다. 그래서 컨트롤러에이 수정을 시도 :

@Controller 
public class MyFormController { 

    // Moved URLs up here, with references in @RequestMappings 
    private static final String[] MY_URLS = 
      {"/us-form.html", "/de-form.html", "/fr-form.html"}; 

    // GET request 
    @RequestMapping(value=MY_URLS, // <-- considered non-constant 
      method={RequestMethod.GET}) 
    public String showMyForm() { 
     // Do some stuff like adding values to the model 
     return "my-form-view"; 
    } 

    // POST request 
    @RequestMapping(value=MY_URLS, // <-- considered non-constant 
      method={RequestMethod.POST}) 
    public String submitMyForm() { 
     // Do stuff like validation and error marking in the model 
     return "my-form-view"; // Same as GET 
    } 
} 

여기서 문제는 컴파일러가 일정하게되고 더 이상 value 속성에 대해 불평하는 것이 없다. 나는 봄이 value이 상수 여야한다는 것을 알고 있지만 리터럴을 포함하는 Array 리터럴을 사용하여 final 필드 (또는 제 경우에는 static final)를 사용하면 "상수"로 전달할 수 있다고 생각했습니다. 제 생각에 여기서 배열 리터럴은 value 특성이 구문 분석 될 때 초기화되지 않는 방식으로 즉석에서 작성되어야합니다.

기본 Java 지식으로 파악하기가 어려워서는 안되는 것처럼 느껴지지만, 일부 연구 후에는 대답을 찾을 수 없었습니다. 누군가가 내 의혹을 확인하고 그 이유가 무엇인지에 대한 인용이나 좋은 설명을 주거나 의심을 부인하고 실제 문제가 무엇인지 설명 할 수 있습니까?

참고 : 각 양식 URL은 현지화 된 사이트의 언어이므로 URL을 Path Pattern으로 간단하게 조합 할 수 없으며 일치시킬 수 없습니다. 예를 들어, 위의 "/{locale}-form.html"문자열을 내 URL로 제공하기 만하면됩니다.

+0

중복 가능한 [주석 속성 값 RequestMapping.value는 상수 표현식이어야합니다.] (http://stackoverflow.com/questions/14213723/the-value-for-annotation-attribute-requestmapping-value-must- be-a-constant-expre) – sp00m

+0

@ sp00m 실제로 복제본 일 수 있습니다. 그것이 저와 같은 리터럴에 반대되는 방식의 반환 값을 사용하는 질문자 때문에 속은 사람인지 확실하지 않았습니다. – ajp15243

답변

5

맞아요, 이건 Spring과 아무 관련이 없어요. 모든 Annotation 매개 변수는 컴파일 타임 상수 여야합니다. 그것은 기본적인 자바 언어 규칙입니다. 에 고정하는 방법

또한
MY_URLS[0] = "es-form.html"; 

는 처음에 그와 같은 URL에 로케일을 삽입으로 당신을 수 있습니다 :이 아직 완벽하게 합법적이기 때문에

그것을 잘라하지 않습니다 마지막으로 배열 참조를 표시? 기존 링크를 모방하고 있습니까? Spring은 브라우저의 실제 로케일 사용에 대한 지원이 많이 내장되어 있습니다.

+0

'MY_URLS [0]'에 대한 좋은 지적은, 그 의미에 대해 생각해 보았을 것입니다. (요즘 나는 JavaScript 사이트를 많이 보았습니다.) 안타깝게도 우리가이 코드를 작성하고있는 클라이언트가 필요하기 때문에 로케일 고유의 URL을 사용하는 것에 갇혀 있습니다 (가능하다면 가능하다면) 클라이언트 측에서는 힘든 과정이 될 것입니다. 그러나 우리는 아마 그 과정에서 어떤 형태의 슬픔을 얻을 것입니다.) 또한 이미 개최 중이거나 곧 게시 될 예정인이 규칙에 따라 몇 가지 양식 URL이 있으며 막판에 변경하면 재미가 없습니다. – ajp15243

관련 문제