वसंत हाइबरनेट परियोजना के init त्रुटियों का कारण बनता है

मैं विश्वविद्यालय में एक परियोजना के लिए कुछ छात्रों के साथ एक वसंत एमवीसी आवेदन स्थापित करने की कोशिश कर रहा हूं, यह एक वेब आधारित कुकबुक है।

जबकि हैलो वर्ल्ड ने काम किया, हम डेटा को स्टोर करने के लिए हाइबरनेट का उपयोग करके हमारे कोड के लिए कुछ मुश्किल अपवाद प्राप्त करते हैं।

डोमेन वर्ग:

/**
 * POJO which represents a Recipe.
 * @author Nils Sommer
 *
 */
@Entity
@Table(name="recipes")
public class Recipe implements Serializable {

private static final long serialVersionUID = 3239162951065313443L;//generated by       eclipse

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

@Column(name="title")
private String title;

@Column(name="description")
private String description;

@Column(name="content")
private String content;

@Column(name="preparation_endurance")
private int preparationEndurance;

@Column(name="total_endurance")
private int totalEndurance;

@Column(name="creation")
private Date creation;

private List images;
private List ratings;

// ----- Getters and setters here: -----

}

सेवा वर्ग:

@Service("recipeService")
@Transactional
public class RecipeService {

protected static Logger logger = Logger.getLogger("service");

@Resource(name="sessionFactory")
private SessionFactory sessionFactory;

public Recipe getRecipe(int id) {
    logger.debug("Retrieving person with id: " + id);

   //Retrieve session from Hibernate
    Session session = sessionFactory.getCurrentSession();

   //Get recipe
    Recipe recipe = (Recipe) session.get(Recipe.class, id);

   //Retrieve recipe
    return recipe;
}

public List getAll() {
    logger.debug("Retrieving all persons");

   //Retrieve session from Hibernate
    Session session = sessionFactory.getCurrentSession();

   //Create a Hibernate query (HQL)
    Query query = session.createQuery("FROM  Person");

   //Retrieve all
    return  query.list();
}

public void add(String title, String description, String content,
        int preparationEndurance, int totalEndurance, Date creation) {
    logger.debug("Adding new person");

   //Retrieve session from Hibernate
    Session session = sessionFactory.getCurrentSession();

   //Create a new Recipe
    Recipe recipe = new Recipe();
    recipe.setTitle(title);
    recipe.setDescription(description);
    recipe.setContent(content);
    recipe.setPreparationEndurance(preparationEndurance);
    recipe.setTotalEndurance(totalEndurance);
    recipe.setCreation(creation);

   //Save
    session.save(recipe);
}

public void delete(Integer id) {
    logger.debug("Deleting existing person");

   //Retrieve session from Hibernate
    Session session = sessionFactory.getCurrentSession();

   //Retrieve existing recipe first
    Recipe person = (Recipe) session.get(Recipe.class, id);

   //Delete 
    session.delete(person);
}

public void edit(Integer id, String title, String description, String content,
        int preparationEndurance, int totalEndurance, Date creation) {
    logger.debug("Editing existing person");

   //Retrieve session from Hibernate
    Session session = sessionFactory.getCurrentSession();

   //Retrieve existing recipe via id
    Recipe recipe = (Recipe) session.get(Recipe.class, id);

   //Assign updated values to this recipe
    recipe.setTitle(title);
    recipe.setDescription(description);
    recipe.setContent(content);
    recipe.setPreparationEndurance(preparationEndurance);
    recipe.setTotalEndurance(totalEndurance);
    recipe.setCreation(creation);

   //Save updates
    session.save(recipe);
}
 }

नियंत्रक वर्ग:

package org.cookbookgeeks.webkochbuch.web;

/**
 * @author Nils Sommer
 * 
 * This is the Controller which processes all recipe requests.
 */
@Controller
public class RecipeController {

private static final Logger logger =    LoggerFactory.getLogger(RecipeController.class);

@Resource(name="recipeService")
private RecipeService recipeService;

/**
 * Shows a recipe.
 * @param id of the recipe which wil be shown.
 * @return the view recipe.jsp
 */
@RequestMapping(method=RequestMethod.GET, value="/recipe/{id}")
public String showRecipe(@PathVariable("id") int id, Model model) {
    logger.debug("Returning view recipe with recipe.id=" + id);

   //Get recipe.
    Recipe recipe = recipeService.getRecipe(id);

    model.addAttribute("recipe", recipe);
    return "recipe";
}

/**
 * Adds a recipe and shows it afterwards.
 * @param recipe which is added.
 * @return the view recipe with the id of the created recipe.
 */
@RequestMapping(method=RequestMethod.POST, value="/recipe/add")
public String addRecipe(@ModelAttribute("recipe") Recipe recipe) {
    //TODO: create recipe from post parameter   
    return "/recipe/" + recipe.getId();
}

/**
 * Deletes a recipe and redirects to the start page.
 * @param id of the recipe which gets deleted.
 * @return the view of the start page.
 */
@RequestMapping(method=RequestMethod.GET, value="/recipe/delete/{id}")
public String deleteRecipe(@PathVariable("id") int id) {
    //TODO: delete recipe.
    return "/";
}

/**
 * Edits a recipe and show it afterwards.
 * @param recipe which gets edited.
 * @return the view recipe with the id of the recipe.
 */
@RequestMapping(method=RequestMethod.POST, value="/recipe/edit")
public String editRecipe(@ModelAttribute("recipe") Recipe recipe) {
    //TODO: edit recipe.
    return "/recipe/" + recipe.getId();
}

}

हम ग्रहण आधारित वसंत उपकरण किट एसडीके का उपयोग करते हैं और स्टार्टअप के दौरान निम्नलिखित अपवाद प्राप्त करते हैं:

HTTP Status 500 - Servlet.init() for servlet appServlet threw exception

type Exception report

message Servlet.init() for servlet appServlet threw exception

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

exception

javax.servlet.ServletException: Servlet.init() for servlet appServlet threw exception
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    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

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'recipeController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'recipeService' is defined
    org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:306)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    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:628)
    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:651)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    javax.servlet.GenericServlet.init(GenericServlet.java:160)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    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

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'recipeService' is defined
    org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:570)
    org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1108)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:278)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:270)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
    org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:442)
    org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:416)
    org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:550)
    org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:150)
    org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:303)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    org.springframework.beans.factory
2
@chrylis मैंने अभी कुछ पोस्ट कॉन्फ़िगरेशन फ़ाइलों के साथ मूल पोस्ट को अपडेट किया है। शायद यह मदद करता है।
जोड़ा लेखक nsommer, स्रोत
@chrylis मैंने बस RecipeService कंस्ट्रक्टर में एक लॉग स्टेटमेंट डाला है, इसने स्टार्टअप के दौरान किसी भी डीबग आउटपुट का कारण नहीं बनाया है, इसलिए मुझे लगता है कि यह वाकई क्लास समस्या को ढूंढ रहा है जैसा आपने बताया था। हालांकि, मुझे समझ में नहीं आता कि स्पष्ट नामकरण के उपयोग के साथ आपका क्या मतलब है, क्या आप इसे मुझे समझा सकते हैं?
जोड़ा लेखक nsommer, स्रोत
आप इसे कैसे लॉन्च कर रहे हैं? क्या आपका @Service क्लास घटक-स्कैन किया गया है? अपनी संदर्भ विन्यास पोस्ट करें।
जोड़ा लेखक chrylis, स्रोत
@ निकटर पैकेज घोषणाओं को "अप्रासंगिक" के रूप में न हटाएं। वे शायद यहां पूरी समस्या है।
जोड़ा लेखक chrylis, स्रोत
मैं ध्यान दूंगा कि आप चीजों का बहुत स्पष्ट नामकरण कर रहे हैं (उदा।, @ सेवा और @Resource नाम); समस्या सिर्फ दूर जा सकती है अगर आपके पास वहां नहीं था, और आपको वास्तव में उस तरह की चीज़ के लिए स्थिरांक का उपयोग करना चाहिए। यह देखने के लिए कि बीन को तुरंत चालू किया जा रहा है या नहीं, अपने पकाने की विधि कन्स्ट्रक्टर में एक लॉग स्टेटमेंट रखें; इससे आपको यह निर्धारित करने में मदद मिलेगी कि यह एक खोज-द-क्लास समस्या या ग्राफ़-रिज़ॉल्यूशन समस्या है या नहीं।
जोड़ा लेखक chrylis, स्रोत
@nsommer सुनिश्चित करें कि लॉग स्टेटमेंट एक स्तर का है जो चालू है (मैं आमतौर पर error या यहां तक ​​कि System.err का उपयोग करता हूं यह सुनिश्चित करने के लिए कि मैं इसे पकड़ूं)। नामकरण के संबंध में, यदि आप कक्षा में @ सेवा को केवल एनोटेट करते हैं, तो स्प्रिंग कक्षा के नाम के ऊंट का ऊन का नाम देगा, और यदि आप @Resource / @Autowired / @Inject , यह प्रकार के अनुसार दिखाई देगा, और आप टाइपो से बचेंगे।
जोड़ा लेखक chrylis, स्रोत
मुझे लगता है, आपके पास web.xml में सर्वलेट परिभाषा नहीं है या यह उचित नहीं है। क्या आप web.xml पोस्ट कर सकते हैं?
जोड़ा लेखक erencan, स्रोत

2 उत्तर

समस्या यह है कि आपके पास बहुत सी वसंत संदर्भ फाइलें हैं और आप सही लोड नहीं कर रहे हैं। आपके पास root-context.xml परिभाषित और web.xml से लोड किया गया है (जिसे मैं एक्सएमएल कॉन्फ़िगरेशन का उपयोग करते समय भी अनुशंसा करता हूं; यदि आपको जरूरी है, तो <कोड का उपयोग करें > विशिष्ट संदर्भ एक्सएमएल से आयात करें)। फिर अपने सर्वलेट के लिए, आप servlet-context.xml लोड कर रहे हैं, जो केवल आपके वेब पैकेज स्कैनिंग घटक है। बेस पैकेज को स्कैन करने के लिए आपको अपने web.xml में वसंत को संदर्भित करने के संदर्भ की आवश्यकता है; वे app-context.xml और applicationContext.xml फ़ाइलें वास्तव में कहीं भी लोड नहीं हो रही हैं।

जावाकॉन्फिग सिस्टम के पक्ष में संभवतः यदि संभव हो तो एक्सएमएल कॉन्फ़िगरेशन से बचने के लिए मेरी सिफारिश है; मेरे पूरे एप्लिकेशन के लिए मेरे पास एक मुख्य प्रविष्टि-बिंदु <कोड> @ कॉन्फ़िगरेशन क्लास है जो तब किसी अन्य @ कॉन्फ़िगरेशन s के लिए घटक-स्कैन करता है।

0
जोड़ा
दोस्त, बहुत बहुत धन्यवाद! आप सही थे, दो कॉन्फ़िगरेशन फ़ाइलें बिल्कुल लोड नहीं हो रही थीं! इसे ठीक करने के बाद नुस्खा सेवा के बारे में कोई त्रुटि नहीं है। कॉन्फ़िगरेशन फ़ाइलों की बड़ी मात्रा मानक एमवीसी टेम्पलेट और वसंत के साथ हाइबरनेट सीखने के लिए एक ट्यूटोरियल दोनों से आई थी। ईमानदार होने के लिए, मैं अभी भी वसंत में कॉन्फ़िगरेशन के बारे में बहुत उलझन में हूं (जहां कॉन्फ़िगर करना है, और कैसे (xml या जावा))। वैसे भी, बहुत बहुत धन्यवाद!
जोड़ा लेखक nsommer, स्रोत
दिलचस्प लगता है, मैं यह करूँगा।
जोड़ा लेखक nsommer, स्रोत
@nsommer JavaConfig वाक्यविन्यास जानें; यह समझना बहुत आसान है, अधिक लचीला, और मॉड्यूलरलाइजेशन के लिए अधिक उपयुक्त (जैसे कि एक बड़ी परियोजना के मॉड्यूल में @ कॉन्फ़िगरेशन डालने की तरह जो आंतरिक आंतरिक बिट्स का ख्याल रखता है)। यदि आपको किसी कारण से एक्सएमएल का उपयोग करना है, तो आप एक मामूली संदर्भ लिख सकते हैं जो केवल एनोटेशन प्रोसेसिंग चालू करता है और एक प्रारंभिक कॉन्फ़िगरेशन क्लास लोड करता है।
जोड़ा लेखक chrylis, स्रोत

are your using ? because your @Service annotation is not recognized by container. please include the packages

0
जोड़ा
वर्तमान में हम इस घटक-स्कैन टैग का उपयोग दोनों स्रोत/मुख्य/संसाधन/मेटा-आईएनएफ/ऐप-संदर्भ.एक्सएमएल और src/main/webapp/WEB-INF/applicationContext.xml में करते हैं, हमने अभी शीर्ष स्तर पैकेज घोषित किया है (संगठन। cookbookgeeks.webkochbuch) भले ही सर्विस क्लास org.cookbookgeeks.webkochbuch.service में है, लेकिन मैं यहां अन्य धागे में पढ़ता हूं, कि घटक-स्कैन दिए गए पैकेज को बार-बार स्कैन करता है ताकि कोई समस्या न हो (हमने पहले से ही घोषणा करने की कोशिश की है सेवा पैकेज)।
जोड़ा लेखक nsommer, स्रोत