1

エラーメッセージが表示されます:org.springframework.web.util.NestedServletException:リクエストの処理に失敗しました。ネストされた例外はjava.lang.ClassCastExceptionです:java.lang.Objectをcom.crimetrack.business.Loginにキャストできません

Login.java

public class Login {

    private String userName;
    private String password;
    private boolean loggedin;

    public Login(){};

    /**
     * @return the loggedin
     */
    public boolean isLoggedin() {
        return loggedin;
    }

    /**
     * @param loggedin the loggedin to set
     */
    public void setLoggedin(boolean loggedin) {
        this.loggedin = loggedin;
    }

    /**
     * @param userName
     * @param password
     */
    public Login(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }

    /**
     * @return the userName
     */
    public String getUserName() {
        return userName;
    }

    /**
     * @param userName the userName to set
     */
    public void setUserName(String userName) {
        this.userName = userName;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }

}

@Controller
public class AuthenticationController {

    private final Logger logger = Logger.getLogger(getClass());

    private AuthenticationManager authenticationManager;
    private Login login = new Login();

    String message = "Congrulations You Have Sucessfully Login";
    String errorMsg = "Login Unsucessful";

    @RequestMapping(value="login.htm")
    public ModelAndView onSubmit(Object command) throws ServletException {

        String userName = ((Login)command).getUserName();
        String password = ((Login)command).getPassword();

        login.setUserName(userName);
        login.setPassword(password);

        logger.info("Login was set");

        logger.info("the username was set to " + login.getUserName());
        logger.info("the password was set to " + login.getPassword());

        if (authenticationManager.Authenticate(login) == true){
            return new ModelAndView("main","welcomeMessage", message);
        }

        //return new ModelAndView("main","welcomeMessage", message);
        return new ModelAndView("login","errorMsg", "Error!!!");
    }

}
4

2 に答える 2

2

このソリューションを試してください:

JSP

<form:form action="yourUrl" modelAttribute="login" method="POST">
<% ... %>
</form:form>

コントローラ

// your method that prints the form
public ModelAndView onGet(@ModelAttribute Login login) {
    // return ...
}

@RequestMapping(value="login.htm")
public ModelAndView onSubmit(@ModelAttribute Login login) {
    String userName = login.getUserName();
    String password = login.getPassword();
    // ...
}

説明

注釈@ModelAttributeは。とまったく同じように機能しmodel.addAttribute(String name, Object value)ます。たとえば、はと@ModelAttribute Login login同じmodel.addAttribute("login", new Login());です。

そうは言っても、このonGetメソッドでは、そのようなオブジェクトをビューに渡します。属性のおかげmodelAttribute="login"で、タグ<form:form>はモデルの属性のリストを調べて、名前がであるものを見つけますlogin。見つからない場合は、例外がスローされます。

次に、これが魔法の部分です。タグを使用すると、Spring MVCは、属性に含まれるBean<form:input path="userName" />のプロパティを自動的に設定します。つまり、あなたの場合は。のようなものを入れた場合、Beanにはそのようなプロパティがないため、例外がスローされます。userNamemodelAttribute="login"login<form:input path="wtf" />Login

したがって、最後に、onSubmitメソッドで(もう一度、アノテーションに感謝します) 、以前にSpringMVCによって自動バインドされ@ModelAttributeたBeanにアクセスできます。login

ノート

私は個人的に(ほとんど)ModelAndViewインスタンスを使用しませんが、次のように進めます。

// the methods can have the name you want
// not only onGet, onPost, etc. as in servlets

@RequestMapping("url1.htm")
public String loadAnyJsp(@ModelAttribute Login login) {
    return "path/to/my/views/login";
}

@RequestMapping("url2.htm")
public String redirectToAnotherController(@ModelAttribute Login login) {
    return "redirect:url1.htm";
}

JSPへのパスは、web.xmlファイル内で指定されます。次に例を示します。

...
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:favorPathExtension="true" p:favorParameter="true" p:ignoreAcceptHeader="true" p:defaultContentType="text/html">
    <description>Depending on extension, return html with no decoration (.html), json (.json) or xml (.xml), remaining pages are decoracted</description>
    <property name="mediaTypes">
        <map>
            <entry key="xml" value="application/xml" />
            <entry key="json" value="application/json" />
            <entry key="html" value="text/html" />
            <entry key="action" value="text/html" />
        </map>
    </property>
    <property name="defaultViews">
        <list>
            <bean class="org.springframework.web.servlet.view.xml.MarshallingView" p:marshaller-ref="xstreamMarshaller" />
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
        </list>
    </property>
    <property name="viewResolvers">
        <list>
            <bean id="nameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
                <description>Maps a logical view name to a View instance configured as a Spring bean</description>
            </bean>
            <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/views/" p:suffix=".jsp" />
        </list>
    </property>
</bean>
...

詳細については、ドキュメントをお読みください(16.5ビューの解決を参照)。

于 2012-08-28T12:19:17.327 に答える
1

「onSubmit」メソッドで、にキャストcommandしていLoginます。

どうやらそうではありません。

于 2012-08-28T12:07:38.370 に答える