2008-09-29 45 views
5

Tôi đang sử dụng spring 2.5 và đang sử dụng chú thích để định cấu hình bộ điều khiển của mình. Bộ điều khiển của tôi hoạt động tốt nếu tôi không thực hiện bất kỳ giao diện bổ sung nào, nhưng vùng chứa lò xo không nhận ra ánh xạ yêu cầu/bộ điều khiển khi tôi thêm các triển khai giao diện.Bộ điều khiển Spring-MVC được chú thích không được nhận diện khi bộ điều khiển mở rộng giao diện

Tôi không thể hiểu tại sao việc thêm triển khai giao diện làm rối loạn cấu hình của bộ điều khiển và ánh xạ yêu cầu. Bất kỳ ý tưởng?

Vì vậy, hoạt động này:

package com.shaneleopard.web.controller; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.security.providers.encoding.Md5PasswordEncoder; 
import org.springframework.stereotype.Controller; 
import org.springframework.validation.Errors; 
import org.springframework.validation.Validator; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

import com.shaneleopard.model.User; 
import com.shaneleopard.service.UserService; 
import com.shaneleopard.validator.RegistrationValidator; 
import com.shaneleopard.web.command.RegisterCommand; 

@Controller 
public class RegistrationController { 

    @Autowired 
    private UserService userService; 

    @Autowired 
    private Md5PasswordEncoder passwordEncoder; 

    @Autowired 
    private RegistrationValidator registrationValidator; 

    @RequestMapping(method = RequestMethod.GET, value = "/register.html") 
    public void registerForm(@ModelAttribute RegisterCommand registerCommand) { 
     // no op 
    } 

    @RequestMapping(method = RequestMethod.POST, value = "/register.html") 
    public String registerNewUser(@ModelAttribute RegisterCommand command, 
      Errors errors) { 
     String returnView = "redirect:index.html"; 

     if (errors.hasErrors()) { 
      returnView = "register"; 
     } else { 
      User newUser = new User(); 
      newUser.setUsername(command.getUsername()); 
      newUser.setPassword(passwordEncoder.encodePassword(command 
        .getPassword(), null)); 
      newUser.setEmailAddress(command.getEmailAddress()); 
      newUser.setFirstName(command.getFirstName()); 
      newUser.setLastName(command.getLastName()); 

      userService.registerNewUser(newUser); 
     } 
     return returnView; 

    } 

    public Validator getValidator() { 
     return registrationValidator; 
    } 
} 

nhưng điều này không:

package com.shaneleopard.web.controller; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.security.providers.encoding.Md5PasswordEncoder; 
import org.springframework.stereotype.Controller; 
import org.springframework.validation.Errors; 
import org.springframework.validation.Validator; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

import com.shaneleopard.model.User; 
import com.shaneleopard.service.UserService; 
import com.shaneleopard.validator.RegistrationValidator; 
import com.shaneleopard.web.command.RegisterCommand; 

@Controller 
public class RegistrationController extends ValidatingController { 

    @Autowired 
    private UserService userService; 

    @Autowired 
    private Md5PasswordEncoder passwordEncoder; 

    @Autowired 
    private RegistrationValidator registrationValidator; 

    @RequestMapping(method = RequestMethod.GET, value = "/register.html") 
    public void registerForm(@ModelAttribute RegisterCommand registerCommand) { 
     // no op 
    } 

    @RequestMapping(method = RequestMethod.POST, value = "/register.html") 
    public String registerNewUser(@ModelAttribute RegisterCommand command, 
      Errors errors) { 
     String returnView = "redirect:index.html"; 

     if (errors.hasErrors()) { 
      returnView = "register"; 
     } else { 
      User newUser = new User(); 
      newUser.setUsername(command.getUsername()); 
      newUser.setPassword(passwordEncoder.encodePassword(command 
        .getPassword(), null)); 
      newUser.setEmailAddress(command.getEmailAddress()); 
      newUser.setFirstName(command.getFirstName()); 
      newUser.setLastName(command.getLastName()); 

      userService.registerNewUser(newUser); 
     } 
     return returnView; 

    } 

    public Validator getValidator() { 
     return registrationValidator; 
    } 
} 
+0

tôi nên thêm rằng bộ điều khiển được đăng ký với những điều sau trong cấu hình ngữ cảnh mùa xuân của tôi: và sử dụng DefaultAnnotationHandlerMapping và AnnotationMethodHa ndlerAdapter – layne

+0

Dường như bạn đang nhập ValidatingController - tên lớp đầy đủ là gì? –

+0

Tôi đang nhập. Đó là trong cùng một gói như ví dụ điều khiển ở trên. Tôi nên thêm mã trên hoạt động khi tôi mở rộng lớp cơ sở ValidatingController, nhưng khi tôi mã ValidatingController như một giao diện và có RegistrationController thực hiện nó, sau đó nó phá vỡ. – layne

Trả lời

0

Tôi nghĩ rằng bạn sẽ thấy rằng vấn đề là phải làm gì với thừa kế và sử dụng các chú thích, họ không trộn đều.

Bạn đã thử triển khai thực hiện việc sử dụng thừa kế ở trên và SimpleFormController cùng với tất cả các chi tiết khác được định cấu hình trong ngữ cảnh ứng dụng của bạn chưa? Điều này sẽ ít nhất thu hẹp vấn đề xuống một chú thích và vấn đề thừa kế.

3

layne, bạn mô tả sự cố xảy ra khi lớp điều khiển của bạn triển khai giao diện, nhưng trong mẫu mã bạn đã cung cấp, sự cố xảy ra khi lớp điều khiển của bạn mở rộng một lớp khác của bạn, ValidatingController.

Có lẽ lớp cha cũng định nghĩa một số chú thích Spring và vùng chứa Spring nhận ra chúng trước và phân loại lớp điều khiển là loại đối tượng được quản lý đó và không bận tâm kiểm tra chú thích @Controller mà bạn cũng đã xác định trong lớp con. Chỉ cần đoán, nhưng nếu điều đó xảy ra, tôi khuyên bạn nên báo cáo cho nhóm Spring, vì nó giống như một con bọ.

0

Theo mặc định JDK proxy được tạo bằng giao diện và nếu điều khiển thực hiện một giao diện chú thích RequestMapping bị bỏ qua như targetClass không được sử dụng

Thêm này trong servlet bối cảnh cấu hình của bạn:

<aop:aspectj-autoproxy proxy-target-class="true"/> 
Các vấn đề liên quan