0

我試圖在控制器中注入我的dao對象。我這樣做: 我一個:
1. MongoDBHelper
2. MerchantDAO
3. MerchantService
4. MerchantController在播放java中注入構造函數的錯誤mongodb

這是MongoDBHelper類:

import javax.inject.Singleton; 

@Singleton 
public class MongoDBHelper { 
    private DB db; 
    private Datastore datastore; 
    private Configuration config = Play.application().configuration(); 

    private final String SERVER_URL = config.getString("server_url"); 

    private final String USERNAME = config.getString("database.userName"); 
    private final String PASSWORD = config.getString("database.password"); 
    private final String DATABASE_NAME = config.getString("database.name"); 

    public MongoDBHelper() { 

     try { 
      MongoClient mongoClient = new MongoClient(); 
      this.db = mongoClient.getDB(DATABASE_NAME); 
      this.db.authenticate(USERNAME, PASSWORD.toCharArray()); 
      Morphia morphia = new Morphia(); 
      this.datastore = morphia.createDatastore(mongoClient, DATABASE_NAME); 
      morphia.mapPackage("models"); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } 
    } 

    public DB getDB() { 
     return this.db; 
    } 

    public Datastore getDatastore() { 
     return this.datastore; 
    } 
} 

這是MerchantDAO類

public class MerchantDAO { 

    @Inject MongoDBHelper mongoDBHelper; 
    private Datastore datastore = mongoDBHelper.getDatastore(); 
    private DB db = mongoDBHelper.getDB(); 

    private static final String AUTH_TOKEN = "authToken"; 

    private static final Config config = ConfigFactory.load(Play.application().configuration().getString("property.file.name")); 

    public void updateMerchantWithAuthToken(Merchant merchant){ 

     Query<Merchant> query = datastore.createQuery(Merchant.class).field(config.getString("string.email")).equal(merchant.getEmail()); 
     UpdateOperations<Merchant> ops = datastore.createUpdateOperations(Merchant.class).set(AUTH_TOKEN, merchant.getAuthToken()).set("lastRequestTime",merchant.getLastRequestTime()); 
     UpdateResults res = datastore.update(query, ops); 
    } 
} 
} 

這是MerchantService類:

public class MerchantService { 

    static final Config config = ConfigFactory.load(Play.application().configuration().getString("property.file.name")); 

    @Inject 
    MerchantDAO merchantDAO; 

    // Creating unique authToken for already logged in merchant 
    public String createToken(Merchant merchant) { 
     merchantDAO.updateMerchantWithAuthToken(merchant); 
     return authToken; 
    } 
} 

這是MerchantController

import javax.inject.Inject; 

public class MerchantController extends Controller { 

    @Inject MerchantService merchantService; 

    public final static String AUTH_TOKEN_HEADER = "X-AUTH-TOKEN"; 
    public static final String AUTH_TOKEN = "authToken"; 
    public static final Config config = ConfigFactory.load(Play.application().configuration().getString("property.file.name")); 

    public static Merchant getMerchant() { 
     return (Merchant)Http.Context.current().args.get("merchant"); 
    } 

    public Result login() throws Exception { 
     // code to perform login 
     return ok(); // status success/failure 
    } 
} 

我收到以下錯誤:

ProvisionException: Unable to provision, see the following errors: 

1) Error injecting constructor, java.lang.NullPointerException 
    at daos.MerchantDAO.<init>(MerchantDAO.java:22) 
    while locating daos.MerchantDAO 
    for field at services.MerchantService.merchantDAO(MerchantService.java:26) 
    while locating services.MerchantService 
    for field at controllers.MerchantController.merchantService(MerchantController.java:21) 
    while locating controllers.MerchantController 
    for parameter 2 at router.Routes.<init>(Routes.scala:36) 
    while locating router.Routes 
    while locating play.api.inject.RoutesProvider 
    while locating play.api.routing.Router 

1 error 

什麼我可能做錯了嗎?爲什麼DI不能正常工作?

在此先感謝。

回答

1

我認爲這個問題是這些線路:

private Datastore datastore = mongoDBHelper.getDatastore(); 
private DB db = mongoDBHelper.getDB(); 

這些對象實例的施工過程中進行評估。我相信直到對象實例完成構建後纔會發生注入。因此,在做出上述分配時,mongoDBHelper爲空。

解決此問題的一種方法是在方法updateMerchantWithAuthToken中設置數據存儲區和數據庫。

+0

我將這些初始化臨時移動到'updateMerchantWithAuthToken'中。但仍然出現此錯誤: '[info] play.api.UnexpectedException:意外的異常[ProvisionException:無法設置,請參閱以下錯誤: [info] [info] 1)錯誤注入構造函數org.mongodb.morphia .mapping.MappingException:無法從包模型 [info] at daos.MerchantDAO獲取地圖類。 (MerchantDAO.java:20) [信息],而定位daos.MerchantDAO 在services.MerchantService.merchantDAO(MerchantService.java:25)[信息]現場 ...' – iaL

+0

我想這個問題是我的MongoDB幫手類...我認爲它無法映射模型。 任何幫助將不勝感激。謝謝。 – iaL

0

問題是,您正試圖在MongoDBHelper實例化期間訪問Configuration對象。你應該只注入遊戲配置對象,以你的模塊構造並初始化構造函數中的所有特性:

@Inject 
public MongoDBHelper(Configuration configuration) { 

    config = Play.application().configuration(); 
    <read the rest of the config values here> 

見注:在直噴式的配置綁定部分文檔here