2017-07-05 66 views
0

我是對於Java環境(Eclipse,Spring等)來說並不陌生,現在只是介紹一些入門教程。我剛剛完成了Spring MVC的Hello World教程,其中有一個簡單的頁面,然後發佈到另一個操作。直截了當。執行Java Web App時未發現類

然後我接着修改了一下該教程的工作結果。我的第一個嘗試是在Eclipse中創建另一個項目,只包含一些包含POJO的簡單包。這個想法是讓不同的應用程序可以使用的東西。 (打算相當於.NET世界中的「類庫」項目。)

該項目有一個包,帶有一個接口(IWorld)和一個類(HelloWorld)。在我的Spring MVC項目中,我將其他項目添加到構建路徑並在控制器中創建該對象的一個​​實例。編譯器說,一切都很好:

package com.sandbox.application.mvctest.controllers; 

import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 

import com.sandbox.domain.models.*; 

@Controller 
public class HelloWorldController { 

    @RequestMapping("/") 
    public String hello() { 
     IWorld world = new HelloWorld(); 
     world.speak(); 
     return "hello"; 
     //TODO: Return a ModelAndView instead 
    } 

    @RequestMapping(value = "/hi", method = RequestMethod.GET) 
    public String hi(@RequestParam("name") String name, Model model) { 
     String message = "Hi " + name + "!"; 
     model.addAttribute("message", message); 
     return "hi"; 
    } 

} 

.speak()方法沒有做筆記的任何事情,只是返回該控制器尚未使用,一個值。當然,其目的是在模型中開始構建一些功能,而不僅僅是在控制器和視圖中構建一些功能,從而構建更多豐富的領域模型。

Eclipse不會抱怨代碼,一切似乎編譯得很好。但在Tomcat運行時,我得到一個異常:

Jul 05, 2017 12:36:49 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Allocate exception for servlet [springDispatcher] 
java.lang.ClassNotFoundException: com.sandbox.domain.models.IWorld 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1269) 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1104) 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    [and so on...] 

我的谷歌搜索已被證明無果而終,到目前爲止,可能是因爲我並不總是知道我發現了什麼。例如,有一些帖子建議糾正pom.xml文件中的內容。我沒有這樣的文件。這與Spring的依賴注入有關嗎?我應該使用它嗎?我不會認爲這是一個可注入的依賴項,我只是直接創建一個實例。但是,我也正在從一個深陷教條的.NET思維模式中接受這個,所以所有的投注都關閉了。

我在這裏錯過了什麼?

+3

您需要打包「Class Library」並將其包含在Spring應用程序中。在Java中,通常是[jar文件](https://docs.oracle.com/javase/tutorial/deployment/jar/)。通常我們會使用['maven'](https://spring.io/guides/gs/maven/)打包這些庫(這是一個項目理解/依賴管理工具)。它是使用'pom.xml'的'maven'。日食的'maven'插件叫做m2e。你可能會想[「mavenize」](https://stackoverflow.com/questions/2449461/convert-existing-eclipse-project-to-maven-project)你的項目。 –

+0

@ElliottFrisch:有什麼我可以在Eclipse中手動執行以包含它嗎?我正在查看MVC項目的屬性,我看到在「項目引用」下選擇的另一個項目以及在「Java Build Path」中的項目下列出的項目。至少聽起來我應該比我預期的更早地諮詢Maven教程。 (編輯:剛剛看到你的編輯。該mavenize鏈接看起來非常有用,謝謝!) – David

回答

1

如果我正確理解您的問題,那麼您期望項目類路徑和Web應用程序類路徑是相同的。部署Web應用程序時,不會自動導出所有依賴項。您可以檢查部署的Web應用程序的WEB-INF/lib文件夾是否存在依賴關係。

如果您使用Tomcat作爲您的servlet容器,那麼您可以在Tomcat的lib文件夾中添加依賴jar,然後它應該可以工作。

+0

這讓我開始運行。特別是(現在我回想起過去類似的嘗試)我需要將「類庫」項目添加到項目屬性的「部署程序集」部分。謝謝! – David

-2

您正在使用springframework,因此您可以創建com.sandbox.domain.models.IWorld的bean並使用@Autowired tp依賴注入。參考代碼

@Autowired 
private IWorld world;