简体   繁体   English

Spring MVC Web 应用程序:找不到默认构造函数

[英]Spring MVC web application: No default constructor found

Project ZIP: http://goo.gl/ddhLg5项目邮编: http : //goo.gl/ddhLg5


Spring web app cannot be executed giving HTTP Status 500 error.无法执行 Spring Web 应用程序并给出 HTTP 状态 500 错误。 It also writes out that No default constructor found for DSLR but in fact there is a default constructor.它还写出没有为 DSLR 找到默认构造函数,但实际上有一个默认构造函数。 Maybe it has to do with application context or the way my beans declared?也许它与应用程序上下文或我的 bean 声明的方式有关? What is the reason my application cannot start?我的应用程序无法启动的原因是什么?

DSLR:单反:

 package main.java.com.springapp.mvc.model;

    public class DSLR {

    public DSLR() {
    }
    public void init() {}

    private int dslrId;
    private String model;
    private int price;
    private String description;

    public int getDslrId() {
        return dslrId;
    }

    public void setDslrId(int dslrId) {
        this.dslrId = dslrId;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return "DSLR [dslr=" + dslrId + ", model=" + model
                + ", price=" + price+ ", description=" + description+"]";
    }
}

web.xml网页.xml

<web-app version="2.4"
                   xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<display-name>Spring MVC Application</display-name>

<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

DSLRServletController-servlet.xml: DSLRServletController-servlet.xml:

 <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
       http://www.springframework.org/schema/beans     
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="main.java.com.springapp.mvc" >
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/" />
        <property name="suffix" value=".jsp" />
    </bean>


    <bean name="s" class="main.java.com.springapp.mvc.controller.DSLRServletController">
        <property  name="dslrDAO" ref="dslrDAO" />
        <property  name="DSLR" ref="DSLR" />
    </bean>
    <bean id="dslrDAO" class="main.java.com.springapp.mvc.dao.DSLRDAO">

    </bean>
    <bean id="DSLR" class="main.java.com.springapp.mvc.model.DSLR">

    </bean>


</beans>

mvc-dispatcher-servlet.xml mvc-dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="main.java.com.springapp.mvc"/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

ERROR:错误:

HTTP Status 500 - Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [[Lmain.java.com.springapp.mvc.model.DSLR;]: No default constructor found; nested exception is java.lang.NoSuchMethodException: [Lmain.java.com.springapp.mvc.model.DSLR;.<init>()

type Exception report

message Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [[Lmain.java.com.springapp.mvc.model.DSLR;]: No default constructor found; nested exception is java.lang.NoSuchMethodException: [Lmain.java.com.springapp.mvc.model.DSLR;.<init>()

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [[Lmain.java.com.springapp.mvc.model.DSLR;]: No default constructor found; nested exception is java.lang.NoSuchMethodException: [Lmain.java.com.springapp.mvc.model.DSLR;.<init>()
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:927)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:811)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:796)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [[Lmain.java.com.springapp.mvc.model.DSLR;]: No default constructor found; nested exception is java.lang.NoSuchMethodException: [Lmain.java.com.springapp.mvc.model.DSLR;.<init>()
    org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:108)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute(HandlerMethodInvoker.java:770)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:363)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:439)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:427)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:915)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:811)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:796)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.lang.NoSuchMethodException: [Lmain.java.com.springapp.mvc.model.DSLR;.<init>()
    java.lang.Class.getConstructor0(Class.java:2810)
    java.lang.Class.getDeclaredConstructor(Class.java:2053)
    org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:105)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute(HandlerMethodInvoker.java:770)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:363)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:439)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:427)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:915)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:811)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:796)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.52 logs.

Main controller class:主控制器类:

package main.java.com.springapp.mvc.controller;

import main.java.com.springapp.mvc.dao.DSLRDAO;
import main.java.com.springapp.mvc.model.DSLR;
import main.java.com.springapp.mvc.pckg.DSLRForm;
import main.java.com.springapp.mvc.pckg.DSLRValidaor;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Serializable;
import java.util.*;

@Controller
public class DSLRServletController extends HttpServlet  {
    static Logger logger = Logger.getLogger(DSLRServletController.class);

    private DSLR DSLR;
    private DSLRDAO dslrDAO;
    private DSLR dslr;

   /* request.setCharacterEncoding("UTF-8");
    response.setContentType("text/html; charset=utf-8");
    List list = getActions(request, response);
    response.setContentType("text/html; charset=UTF-8");*/

    //@Autowired   ???
    public DSLRServletController() {
        this.dslrDAO = new DSLRDAO();
    }

    public void init() {logger.error("DSLRServlet.init(): just started"); }
    /*
            /s                                    GET
            /s?id=1                               GET
            /s?action=save                        POST
            /dslrservice?id=1&tm=<timestamp>      GET
     */
@RequestMapping(value = "/s", method = RequestMethod.GET)
public String showHTMLResponse(@ModelAttribute("dslrs") DSLR dslrs[],
                               @ModelAttribute("dslr") DSLR dslr,
                               @ModelAttribute("dslrErrors") HashMap dslrErrors,
                               @ModelAttribute ("dslrform") DSLRForm dslrForm,
                               @RequestParam("id") String paramId,
                               @RequestParam("action") String paramAction,
                               Model model){

    if(paramId == null || paramId.equals("")){
        //show_all_dslrs
        dslrs = getAllDslrs();    // DSLR adslrs[] -> to MODEL;
       return "dslrs";
    }else{
        //show_this_dslr;
        HashMap<String,Object> dslrHashMap = getDSLRById(paramId);
        dslr = (DSLR) dslrHashMap.get("dslr");
        dslrForm = (DSLRForm)dslrHashMap.get("dslrForm");
        dslrErrors = (HashMap)dslrHashMap.get("dslrErrors");

            if(dslr != null){
//                getServletConfig().getServletContext().getRequestDispatcher("/dslr.jsp").forward(request, response);
                return "dslr";
            }

            else{
                return "error";
            }


    }
}

@RequestMapping(value = "/s", method = RequestMethod.POST)
public String showHTMLResponsePOST(@ModelAttribute("dslrs") DSLR dslrs[],
                               @ModelAttribute("dslrErrors") HashMap<?,?> dslrErrors,
                               @ModelAttribute ("dslrform") DSLRForm dslrForm,

                               @RequestParam("id") String paramId,
                               @RequestParam("action") String paramAction,
                               @RequestParam("dslr_model") String paramModel,
                               @RequestParam("price") String paramPrice,
                               @RequestParam("description") String paramDescription,
                               Model model){
    int iStatusCode = 0;
    if(paramAction.equals("save") )
        iStatusCode = saveDSLR(paramId, paramModel, paramPrice, paramDescription, dslrErrors, dslrForm);    // POST

    return "dslrs";

}

    private int saveDSLR(String paramId,
                         String paramModel,
                         String paramPrice,
                         String paramDescription,
                         HashMap<?,?> context_dslrErrors,
                         DSLRForm context_dslrForm
                         ) {
        int byte0 = 1;
        try {

            DSLRValidaor dslrValidaor = new DSLRValidaor();

            DSLRForm dslrForm = new DSLRForm();
            dslrForm.setDslrId(paramId);
            dslrForm.setModel(paramModel);
            dslrForm.setPrice(paramPrice);
            dslrForm.setDescription(paramDescription);

            HashMap hashmap = dslrValidaor.Validate(dslrForm);
            if(hashmap.size() > 0) {
                context_dslrForm = dslrForm;
                context_dslrErrors = hashmap;
                byte0 = -1;
            } else{
                DSLRDAO planedao = new DSLRDAO();
                DSLR dslr = new DSLR();
                dslr.setDslrId(Integer.parseInt(paramId));
                dslr.setModel(paramModel);
                dslr.setPrice(Integer.parseInt(paramPrice));
                dslr.setDescription(paramDescription);
                planedao.update(dslr);
            }
        }
        catch(Exception exception)
        {
            logger.error((new StringBuilder()).append("DSLRServlet.saveDSLR():").append(exception.getMessage()).toString());
            byte0 = -1;
        }
        return byte0;

    }

    private DSLR[] getAllDslrs(){
        DSLR adslrs[] = null;
        try
        {
            DSLRDAO DSLRDAO = new DSLRDAO();
            adslrs = (DSLR[])DSLRDAO.findAll();
        }
        catch(Exception exception)
        {
            logger.error((new StringBuilder()).append("PlaneServlet.getAllPlanes():").append(exception.getMessage()).toString());
        }
//        request.setAttribute("dslrs", adslrs);
        return adslrs;
    }

    private HashMap<String, Object> getDSLRById(String s)
    {
        HashMap<String,Object> map = new HashMap<String, Object>();

        DSLR dslr = null;
        try {
            int i = Integer.parseInt(s);
            DSLRDAO DSLRDAO = new DSLRDAO();
            dslr = (DSLR)DSLRDAO.findById(i);

            DSLRForm dslrForm = new DSLRForm();
            dslrForm.setDslrId(Integer.toString(dslr.getDslrId()));
            dslrForm.setModel(dslr.getModel());
            dslrForm.setPrice(Integer.toString(dslr.getPrice()));
            dslrForm.setDescription(dslr.getDescription());


            map.put("dslr", dslr);
            map.put("dslrform", dslrForm);
            map.put("dslrErrors", new HashMap());
        }
        catch(Exception exception)
        {
            logger.error((new StringBuilder()).append("DSLRServlet.getDSLRById():").append(exception.getMessage()).toString());
        }
        return map;
    }

    public void setDslrDAO(DSLRDAO dslrDAO) {
        this.dslrDAO = dslrDAO;
    }

    public DSLRDAO getDslrDAO() {
        return dslrDAO;
    }

    public void setDSLR(main.java.com.springapp.mvc.model.DSLR DSLR) {
        dslr = DSLR;
    }

    public main.java.com.springapp.mvc.model.DSLR getDSLR() {
        return dslr;
    }
}

UPDATE1:更新1:

new mvc-dispatcher-servlet.xml:新的 mvc-dispatcher-servlet.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="main.java.com.springapp.mvc" >
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

And @Autowired was put in DSLRServletController:而@Autowired 被放在 DSLRServletController 中:

@Autowired
    public DSLRServletController() {
        this.dslrDAO = new DSLRDAO();
    }

Errors:错误:

exception

javax.servlet.ServletException: Servlet.init() for servlet mvc-dispatcher threw exception
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    java.lang.Thread.run(Thread.java:744)
root cause

java.lang.IllegalStateException: Autowired annotation requires at least one argument: public main.java.com.springapp.mvc.controller.DSLRServletController()
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:243)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:976)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:949)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:490)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:607)
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:598)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:661)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:517)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:458)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    java.lang.Thread.run(Thread.java:744)

For some reason 2 errors appeared.出于某种原因,出现了 2 个错误。 What should be changed to set up project correctly?应该更改什么才能正确设置项目?


UPDATE3更新3

the new mvc-dispatcher-servlet.xml:新的 mvc-dispatcher-servlet.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="main.java.com.springapp.mvc" >
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <bean id="DSLR" class="main.java.com.springapp.mvc.model.DSLR" />
</beans>

Apart from @Autowired added in UPDATE1 , another one is added (in DSLRServletController ):除了@Autowired 添加到UPDATE1之外,还添加了另一个(在DSLRServletController 中):

@Autowired
    public void setDSLR(DSLR DSLR) {
        dslr = DSLR;
    }

UPDATE4:更新4:

Back to the original errors : Could not instantiate bean class [[Lmain.java.com.springapp.mvc.model.DSLR;]回到原来的错误: Could not instantiate bean class [[Lmain.java.com.springapp.mvc.model.DSLR;]

I am confused.我很迷惑。 What's wrong?怎么了?

Inside your controller method , you have used a parameter as array like below在您的控制器方法中,您使用了一个参数作为数组,如下所示

@ModelAttribute("dslrs") DSLR dslrs[]

so use collection like list instead所以改用像列表这样的集合

@ModelAttribute("dslrs") ArrayList<DSLR> dslrs

This is the error message you would get if DSLR had no default constructor:如果DSLR没有默认构造函数,您将收到以下错误消息:

java.lang.NoSuchMethodException: main.java.com.springapp.mvc.model.DSLR.<init>()

Now compare this to your error message:现在将其与您的错误消息进行比较:

java.lang.NoSuchMethodException: [Lmain.java.com.springapp.mvc.model.DSLR;.<init>()

Do you notice the difference?你注意到区别了吗? The [L ? [L ? The error means that you cannot instantiate an array with a constructor, because an array has no constructor.该错误意味着您无法使用构造函数实例化数组,因为数组没有构造函数。 That's why you can't use an array as a parameter for your controller method.这就是为什么不能使用数组作为控制器方法的参数的原因。 At least not that way.至少不是那样。 Use a collection and you are fine.使用一个集合,你很好。

I note a little redundancy.我注意到一点冗余。 It shouldn't, by itself, cause these problems, but it may be worth exploring:它本身不应该导致这些问题,但它可能值得探索:

You use <context:component-scan base-package="main.java.com.springapp.mvc" > , which seems like it's intended to load your @Controller -annotated DSLRServletController .您使用<context:component-scan base-package="main.java.com.springapp.mvc" > ,这似乎是为了加载您的@Controller DSLRServletController If that is the case, then there is no need to declare the bean named s in your XML configuration.如果是这种情况,则无需在 XML 配置中声明名为s的 bean。 You can simply put @Autowired on the bean property setters.您可以简单地将@Autowired放在 bean 属性设置器上。 Alternatively, you can remove the <context:component-scan> from your XML configuration, and trust your delcaration of the controller to be sufficient.或者,您可以从 XML 配置中删除<context:component-scan> ,并相信您对控制器的声明就足够了。

Additionally, though it's probably not related.此外,虽然它可能不相关。 If you load something using @Controller and classpath annotation scanning, you don't need to implement HttpServlet at all.如果使用@Controller和类路径注释扫描加载某些内容,则根本不需要实现HttpServlet The point of @Controller and Spring MVC is to make it so that your controllers can be Plain Old Java Objects (POJOs). @Controller和 Spring MVC 的目的是使您的控制器可以是普通的旧 Java 对象 (POJO)。

Most importantly, it looks like your web.xml is only causing mvc-dispatcher-servlet.xml to be loaded (by using the servlet name as a hint), and nothing is loading DSLRServletController-servlet.xml .最重要的是,看起来你的web.xml只是导致mvc-dispatcher-servlet.xml被加载(通过使用 servlet 名称作为提示),并且没有加载DSLRServletController-servlet.xml A consequence of this, is that your <context:component-scan base-package="main.java.com.springapp.mvc"/> is causing the controller to be loaded, but none of it's properties are being set.这样做的结果是,您的<context:component-scan base-package="main.java.com.springapp.mvc"/>导致加载控制器,但没有设置任何属性。 To further clean up your system, move your DSLRServletController-servlet.xml into mvc-dispatcher-servlet.xml so that your spring contexts are configured from a single config.要进一步清理您的系统,请将您的DSLRServletController-servlet.xml移动到mvc-dispatcher-servlet.xml以便您的 spring 上下文从单个配置中进行配置。

I got the same issue while running Spring boot application using Apache Tomcat 9.0.我在使用 Apache Tomcat 9.0 运行 Spring boot 应用程序时遇到了同样的问题。 Now, I have resolved this.现在,我已经解决了这个问题。

  1. I have commented two lines as below.我评论了两行,如下所示。 (ie, whatever you have used here, just comment and run).then it will work. (即,无论您在此处使用过什么,只需注释并运行)即可。

     @RequestMapping("/userhome") public String userhome(Model model) { System.out.println("inside bck..."); //List<String> colorList = colorList();`enter code here` //model.addAttribute("theme", colorList); //model.addAttribute("home", new UserHome()); return "userhomePage"; }

In my case the problem was not that there is not default constructor.就我而言,问题不在于没有默认构造函数。 The issue was that there were no setters for fields of the json DTO that is passed to the controller in a rest post call.问题是在休息后调用中传递给控制器​​的 json DTO 的字段没有设置器。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM