2010-07-19 18 views
6

Tôi muốn để có thể làm điều này:chúng ta có thể sử dụng biểu thức mùa xuân (trò chơi) trong các chú thích khác không?

@Controller 
@RequestMapping("/#{handlerMappingPaths.security}/*") 
public class SecurityController { 
    etc 

    //for instance, to resuse the value as a base for the folder resolution  
    @Value("#{handlerMappingPaths.security}/") 
    public String RESOURCE_FOLDER; 

    @RequestMapping(value="/signin-again", method = RequestMethod.GET) 
    public String signinAgainHandler() { 
     return RESOURCE_FOLDER + "signin_again"; 
    } 
} 

này không xuất hiện để làm việc bây giờ, tôi thiếu cái gì?

+0

để làm rõ, biểu thức trò chơi hoạt động tốt với chú thích @value để đặt giá trị "RESOURCE_FOLDER", nhưng nó sẽ không hoạt động trong @ Chú thích RequestMapping – chrismarx

Trả lời

0

@Sean trả lời câu hỏi liệu mùa xuân có hỗ trợ điều này hay không, nhưng tôi cũng muốn trả lời câu hỏi thường chỉ cách không sao chép cấu hình khi sử dụng chú thích. Hóa ra điều này có thể sử dụng nhập tĩnh, như sau:

import static com.test.util.RequestMappingConstants.SECURITY_CONTROLLER_PATH 

@Controller 
@RequestMapping("/" + SECURITY_CONTROLLER_PATH + "/*") 
public class SecurityController { 
    etc 

    //for instance, to resuse the value as a base for the folder resolution  
    public String RESOURCE_FOLDER = SECURITY_CONTROLLER_PATH + "/"; 

    @RequestMapping(value="/signin-again", method = RequestMethod.GET) 
    public String signinAgainHandler() { 
     return RESOURCE_FOLDER + "signin_again"; 
    } 
} 
2

Một cách để bạn có thể tìm ra những thứ như thế này là tự mình xem. Đây là một ví dụ cho nhật thực, nhưng nó sẽ hoạt động tương tự cho các IDE khác:

Trước hết, hãy đảm bảo bạn có nguồn thư viện mùa xuân bạn đang sử dụng. Điều này là dễ nhất nếu bạn sử dụng maven, using the maven-eclipse-plugin hoặc sử dụng m2eclipse.

Sau đó, trong Eclipse, chọn Navigate -> Open Type.... Nhập loại bạn đang tìm kiếm (một cái gì đó giống như RequestMa* nên làm cho máy in lười biếng như bản thân mình). Nhập/OK. Bây giờ bấm chuột phải vào tên lớp trong tệp nguồn và chọn References -> Project. Trong chế độ xem tìm kiếm, tất cả các sử dụng của lớp hoặc chú thích này sẽ xuất hiện.

Một trong số đó là DefaultAnnotationHandlerMapping.determineUrlsForHandlerMethods(Class, boolean), nơi đoạn mã này sẽ cho bạn biết rằng ngôn ngữ biểu hiện không được đánh giá:

ReflectionUtils.doWithMethods(currentHandlerType, new ReflectionUtils.MethodCallback() { 
    public void doWith(Method method) { 
     RequestMapping mapping = AnnotationUtils.findAnnotation(
            method, RequestMapping.class); 
     if (mapping != null) { 
      String[] mappedPatterns = mapping.value(); 
      if (mappedPatterns.length > 0) { 
       for (String mappedPattern : mappedPatterns) { 
        // this is where Expression Language would be parsed 
        // but it isn't, as you can see 
        if (!hasTypeLevelMapping && !mappedPattern.startsWith("/")) { 
         mappedPattern = "/" + mappedPattern; 
        } 
        addUrlsForPath(urls, mappedPattern); 
       } 
      } 
      else if (hasTypeLevelMapping) { 
       urls.add(null); 
      } 
     } 
    } 
}, ReflectionUtils.USER_DECLARED_METHODS); 

Hãy nhớ rằng, nó được gọi là mã nguồn mở. Không có điểm trong việc sử dụng Phần mềm nguồn mở nếu bạn không cố gắng hiểu những gì bạn đang sử dụng.

+6

cảm ơn bạn đã trả lời, nhưng hãy tiết kiệm sự không đồng ý của bạn, bạn không biết một poster nào đã thử hoặc chưa được thử - – chrismarx

+2

@chris Đúng, và cũng không thực hiện việc này. SO câu trả lời được nhắm mục tiêu tại một đối tượng lớn hơn chỉ là OP. Tôi đã thực hiện một quan sát chung có lẽ là không hợp lý trong trường hợp của bạn –

+0

dòng cuối cùng = vàng nguyên chất. !! –

Các vấn đề liên quan