【问题标题】:Error injecting constructor, java.lang.NullPointerException at controllers控制器注入构造函数时出错,java.lang.NullPointerException
【发布时间】:2018-04-23 15:07:33
【问题描述】:

我收到以下错误消息:

ProvisionException:无法配置,请参阅以下错误:

1) 注入构造函数时出错,java.lang.NullPointerException at 控制器.ProductsController.(ProductsController.java:20)
同时定位controllers.ProductsController 定位时 router.Routes.(Routes.scala:34) 的第 4 个参数 定位时播放.api.inject.RoutesProvider play.api.routing.Router play.api.http.JavaCompatibleHttpRequestHandler.(HttpRequestHandler.scala:222)的第一个参数 同时定位 play.api.http.JavaCompatibleHttpRequestHandler 而 定位 play.api.http.HttpRequestHandler 对于 play.api.DefaultApplication.(Application.scala:236) 的第 6 个参数 play.api.DefaultApplication.class(Application.scala:235) 而 在定位时定位 play.api.DefaultApplication play.api.Application

1 个错误

这是堆栈跟踪:

com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) Error injecting constructor, java.lang.NullPointerException
  at controllers.ProductsController.<init>(ProductsController.java:20)
  while locating controllers.ProductsController
    for the 4th parameter of router.Routes.<init>(Routes.scala:34)
  while locating router.Routes
  while locating play.api.inject.RoutesProvider
  while locating play.api.routing.Router
    for the 1st parameter of play.api.http.JavaCompatibleHttpRequestHandler.<init>(HttpRequestHandler.scala:222)
  while locating play.api.http.JavaCompatibleHttpRequestHandler
  while locating play.api.http.HttpRequestHandler
    for the 6th parameter of play.api.DefaultApplication.<init>(Application.scala:236)
  at play.api.DefaultApplication.class(Application.scala:235)
  while locating play.api.DefaultApplication
  while locating play.api.Application

1 error
     com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1028)
     com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1054)
     play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:409)
     play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:404)

这是我的代码:

package controllers;

import java.util.List;

import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;

import play.mvc.Controller;
import play.mvc.Result;

import play.data.Form;
import play.data.FormFactory;

import views.html.products.details;
import views.html.products.list;

import models.Product;

public class ProductsController extends Controller {

    @Inject FormFactory formFactory;
    private Form<Product> productForm = formFactory.form(Product.class);

    public Result list() {
        List<Product> products = Product.findAll();
        return ok(list.render(products));
    }

    public Result newProduct() {
        return ok(details.render(productForm));
    }

    public Result details(String ean) {
        return TODO;
    }

    public Result save() {
        return TODO;
    }
}

我不确定我应该怎么做。我一直在到处寻找,找不到任何有用的东西。想法?

【问题讨论】:

    标签: java playframework


    【解决方案1】:

    我想通了,我需要将我的代码更改为如下所示:

    package controllers;
    
    import java.util.List;
    
    import javax.inject.Inject;
    import javax.inject.Provider;
    import javax.inject.Singleton;
    
    import play.mvc.Controller;
    import play.mvc.Result;
    
    import play.data.Form;
    import play.data.FormFactory;
    
    import views.html.products.details;
    import views.html.products.list;
    
    import models.Product;
    
    public class ProductsController extends Controller {
    
        private Form<Product> productForm;
    
        @Inject
        public ProductsController(FormFactory formFactory) {
            this.productForm = formFactory.form(Product.class);
        }
    
        public Result list() {
            List<Product> products = Product.findAll();
            return ok(list.render(products));
        }
    
        public Result newProduct() {
            return ok(details.render(productForm));
        }
    
        public Result details(String ean) {
            return TODO;
        }
    
        public Result save() {
            return TODO;
        }
    }
    

    具体来说,我需要一个带有FormFactory 的构造函数来注入:

    private Form<Product> productForm;
    
    @Inject
    public ProductsController(FormFactory formFactory) {
        this.productForm = formFactory.form(Product.class);
    }
    

    【讨论】:

    • 所以,简而言之,直接字段注入会抛出 NullPointerException。需要构造函数注入。
    猜你喜欢
    • 2012-03-09
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多