Aplicación web Spring MVC: no se ha encontrado ningún constructor predeterminado

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


La aplicación web Spring no puede ejecutarse dando error HTTP Status 500. También escribe que no se ha encontrado ningún constructor predeterminado para DSLR, pero de hecho hay un constructor predeterminado. ¿Tal vez tiene que ver con el contexto de la aplicación o la forma en que mis beans declararon? ¿Cuál es la razón por la que mi aplicación no puede comenzar?

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

  Spring MVC Application  mvc-dispatcher org.springframework.web.servlet.DispatcherServlet 1   mvc-dispatcher /   

DSLRServletController-servlet.xml:

                   

mvc-dispatcher-servlet.xml

        

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;.() 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;.() 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;.() 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;.() 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;.() 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. 

Clase de controlador principal:

 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= 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 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 getDSLRById(String s) { HashMap map = new HashMap(); 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; } } 

ACTUALIZACIÓN1:

nuevo mvc-dispatcher-servlet.xml:

              

Y @Autowired se puso en DSLRServletController:

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

Errores:

 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) 

Por alguna razón aparecieron 2 errores. ¿Qué se debe cambiar para configurar correctamente el proyecto?


ACTUALIZACIÓN3

El nuevo mvc-dispatcher-servlet.xml:

           

Además de @Autowired agregado en UPDATE1 , se agrega otro (en DSLRServletController ):

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

ACTUALIZACIÓN 4:

Volver a los errores originales: Could not instantiate bean class [[Lmain.java.com.springapp.mvc.model.DSLR;]

Estoy confundido. Que pasa

Dentro de su método de controlador, ha utilizado un parámetro como matriz como se muestra a continuación

 @ModelAttribute("dslrs") DSLR dslrs[] 

así que usa la colección como lista en su lugar

 @ModelAttribute("dslrs") ArrayList dslrs 

Este es el mensaje de error que obtendría si DSLR no tuviera un constructor predeterminado:

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

Ahora compare esto con su mensaje de error:

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

¿Te das cuenta de la diferencia? La [L ? El error significa que no puede crear una instancia de una matriz con un constructor, porque una matriz no tiene constructor. Es por eso que no puede usar una matriz como parámetro para su método de controlador. Al menos no de esa manera. Usa una colección y estás bien.

Noto un poco de redundancia. No debería, por sí mismo, causar estos problemas, pero vale la pena explorar:

Utiliza , que parece que está destinado a cargar su @Controller -dispositivo DSLRServletController . Si ese es el caso, entonces no es necesario declarar el bean denominado s en su configuración XML. Simplemente puede poner @Autowired en los establecedores de propiedades de bean. Alternativamente, puede eliminar de su configuración XML, y confiar en que su separación del controlador sea suficiente.

Además, aunque probablemente no esté relacionado. Si carga algo utilizando @Controller y el escaneo de anotaciones de classpath, no necesita implementar HttpServlet en absoluto. El punto de @Controller y Spring MVC es hacerlo para que sus controladores puedan ser objetos Java antiguos (POJO).

Lo más importante es que parece que su web.xml solo está causando que se cargue mvc-dispatcher-servlet.xml (usando el nombre del servlet como una sugerencia), y nada está cargando DSLRServletController-servlet.xml . Una consecuencia de esto, es que su está causando que el controlador se cargue, pero ninguna de sus propiedades se está configurando. Para limpiar aún más su sistema, mueva su DSLRServletController-servlet.xml a DSLRServletController-servlet.xml mvc-dispatcher-servlet.xml para que sus contextos Spring estén configurados desde una única configuración.