Spring MVC Web Application: Default Constructor Not Found

ZIP project: http://goo.gl/ddhLg5


A spring web application cannot be executed with an HTTP Status 500 message. It also writes that no default constructor was found for DSLR, but in fact there is a default constructor. Maybe this is due to the application context or the way I declared beans? What is the reason my app 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

 <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:

  <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

 <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. 

The 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:

new 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 placed in the DSLRServletController:

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

Error:

 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. What needs to be changed for the correct creation of the project?


Update3

new 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> 

In addition to @Autowired added in UPDATE1 , one more is added (in DSLRServletController ):

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

UPDATE4:

Back to the original errors: Could not instantiate bean class [[Lmain.java.com.springapp.mvc.model.DSLR;]

I am embarrassed. What's wrong?

+6
source share
3 answers

Inside your controller method, you used the parameter as an array, as shown below

 @ModelAttribute("dslrs") DSLR dslrs[] 

so use the collection as a list instead

 @ModelAttribute("dslrs") ArrayList<DSLR> dslrs 
+4
source

This is the error message you would get if the DSLR did not have a default constructor:

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

Now compare this with the error message:

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

Did you notice the difference? [L ? The error means that you cannot create an array using the constructor, because the array does not have a constructor. This is why you cannot use an array as a parameter for your controller method. At least not so. Use the collection and you are fine.

+4
source

I note a slight redundancy. This should not in itself lead to these problems, but it might be worth exploring:

You are using <context:component-scan base-package="main.java.com.springapp.mvc" > , which seems to be designed to load your @Controller -annotated DSLRServletController . If so, then there is no need to declare a bean named s in your XML configuration. You can simply put @Autowired in the bean property constructors. Alternatively, you can remove <context:component-scan> from your XML configuration and trust your controller extension to be sufficient.

Also, although this is probably not related. If you load something using @Controller and scan annotations in the classpath, you don't need to implement an HttpServlet . The point of @Controller and Spring MVC is to make sure that your controllers can be plain old Java objects (POJOs).

Most importantly, your web.xml causes the mvc-dispatcher-servlet.xml (using the servlet name as a hint) and DSLRServletController-servlet.xml is not loaded. The consequence of this is that your <context:component-scan base-package="main.java.com.springapp.mvc"/> causes the controller to load, but none of its properties are set. To further clean up your system, move DSLRServletController-servlet.xml to mvc-dispatcher-servlet.xml so that Spring contexts are configured from the same configuration.

+1
source

All Articles