2008-09-29 19 views
5

बढ़ाता है मैं वसंत 2.5 का उपयोग कर रहा हूं, और अपने नियंत्रकों को कॉन्फ़िगर करने के लिए एनोटेशन का उपयोग कर रहा हूं। यदि मैं किसी भी अतिरिक्त इंटरफेस को लागू नहीं करता हूं तो मेरा नियंत्रक ठीक काम करता है, लेकिन जब मैं इंटरफ़ेस कार्यान्वयन जोड़ता हूं तो बसंत कंटेनर नियंत्रक/अनुरोध मैपिंग को नहीं पहचानता है।एनोटेटेड स्प्रिंग-एमवीसी नियंत्रक को मान्यता नहीं दी जाती है जब नियंत्रक इंटरफेस

मैं यह नहीं समझ सकता कि एक इंटरफेस कार्यान्वयन क्यों नियंत्रक की कॉन्फ़िगरेशन और अनुरोध मैपिंग को जोड़ता है। कोई विचार?

तो, यह काम करता है:

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; 
    } 
} 

लेकिन यह नहीं करता है:

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

मैं चाहिए जोड़ें कि नियंत्रक मेरे वसंत संदर्भ कॉन्फ़िगरेशन में निम्न के साथ पंजीकृत हैं: <संदर्भ: घटक-स्कैन बेस-पैकेज = "com.shaneleopard.web" /> और डिफ़ॉल्टअनोटेशन हैंडलर मैपिंग और एनोटेशन मोडरहा ndlerAdapter – layne

+0

ऐसा लगता है कि आप ValidatingController आयात कर रहे हैं - पूरी तरह योग्य क्लास नाम क्या है? –

+0

मैं इसे आयात कर रहा हूं। यह उपरोक्त नियंत्रक उदाहरण के समान पैकेज में है। जब मैं ValidatingController बेस क्लास का विस्तार करता हूं, तो मुझे उपरोक्त कोड कार्य जोड़ना चाहिए, लेकिन जब मैं एक इंटरफ़ेस के रूप में ValidatingController को कोड करता हूं और पंजीकरण नियंत्रक इसे कार्यान्वित करता है, तो यह टूट जाता है। – layne

उत्तर

0

मुझे लगता है कि आप पाएंगे कि समस्या विरासत और उपयोग करते हुए एनोटेशन के साथ क्या करना है, वे नहीं है अच्छी तरह मिलाएं।

क्या आपने ऊपर दिए गए आवेदन को अपने आवेदन संदर्भ में कॉन्फ़िगर किए गए सभी अन्य विवरणों के साथ विरासत और SimpleFormController का उपयोग करने का प्रयास किया है? यह कम से कम एक एनोटेशन और विरासत मुद्दे को समस्या को कम कर देगा।

3

लेन, आप हो रहा है जब आपके नियंत्रक वर्ग एक अंतरफलक को लागू करता है के रूप में समस्या का वर्णन किया है, लेकिन कोड नमूना आपके द्वारा दी गई है, समस्या तब होती है जब अपने नियंत्रक वर्ग तुम्हारा का एक और वर्ग, ValidatingController फैली हुई है।

शायद अभिभावक वर्ग कुछ वसंत एनोटेशन को भी परिभाषित करता है, और वसंत कंटेनर ने उन्हें पहले देखा और नियंत्रक वर्ग को उस प्रकार की प्रबंधित वस्तु के रूप में वर्गीकृत किया और @Controller एनोटेशन की जांच करने के लिए परेशान नहीं किया जिसे आपने उप-वर्ग में भी परिभाषित किया था। बस एक अनुमान है, लेकिन अगर वह बाहर निकलता है, तो मैं इसे स्प्रिंग टीम को रिपोर्ट करने का सुझाव दूंगा, क्योंकि यह एक बग की तरह लगता है।

0

डिफ़ॉल्ट JDK प्रॉक्सी करके इंटरफ़ेस का उपयोग कर बनाई गई हैं और नियंत्रक एक अंतरफलक को लागू करता है, तो RequestMapping एनोटेशन को नजरअंदाज कर दिया जाता है targetClass नहीं किया जाता है के रूप में किया जा रहा

अपने सर्वलेट संदर्भ config में इस जोड़ें:

<aop:aspectj-autoproxy proxy-target-class="true"/>