Java 当我试图通过POST方法创建对象时,为什么会得到NullPointerException?

Java 当我试图通过POST方法创建对象时,为什么会得到NullPointerException?,java,jersey,dropwizard,Java,Jersey,Dropwizard,我一直在编写一些RESTAPI测试,我不知道是我写错了测试,还是我的POST方法无效。 我在执行测试时遇到此错误: 错误[2015-12-14 21:37:00309]org.glassfish.grizzly.servlet.ServletHandler:服务异常: ! java.lang.NullPointerException:null ! 在resources.ActorResource.postActor(ActorResource.java:31)等处 我不知道它是从哪里来的。测试中

我一直在编写一些RESTAPI测试,我不知道是我写错了测试,还是我的POST方法无效。 我在执行测试时遇到此错误:

错误[2015-12-14 21:37:00309]org.glassfish.grizzly.servlet.ServletHandler:服务异常: ! java.lang.NullPointerException:null ! 在resources.ActorResource.postActor(ActorResource.java:31)等处

我不知道它是从哪里来的。测试中的Actor对象已正确初始化,所有这些都应该工作正常

以下是post方法:

    @POST
    @UnitOfWork
    public Saying postActor(@HeaderParam("actorName") String name, @HeaderParam("actorBirthDate") String birthDate) {
        Actor actor = dao.create(new Actor(name,birthDate));
        return new Saying("Added : " + actor.toString());
    }
这是我写的测试

    @Test
    public void postActor() {
        when(movieDAO.create(actor)).thenReturn(actor);
        final Response response = RULE.getJerseyTest().target("/actors").request().post(Entity.text(""));

        assertThat(response.getStatusInfo().getStatusCode()).isEqualTo(Response.Status.OK.getStatusCode());
        verify(movieDAO).create(actor);
    }
编辑 下面是Actor初始化方法

    @Before
    public void setup() {
        actor = new Actor();
        actor.setId(1L);
        actor.setBirthDate("12-03-2014");
        actor.setName("Karol Marks");
    }
演员班

@Entity
@Table(name="Actors")
public class Actor {
    private long id;
    private String name;
    private String birthDate;
    private Movie movie;

    public Actor() {
    }

    public Actor(String name, String birthDate) {
        this.name = name;
        this.birthDate = birthDate;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Column(name = "name", nullable = false)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Column(name = "birthDate", nullable = false)
    public String getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(String birthDate) {
        this.birthDate = birthDate;
    }

    @ManyToOne(cascade = CascadeType.ALL)
    public Movie getMovie() {
        return movie;
    }

    public void setMovie(Movie movie) {
        this.movie = movie;
    }

    @Override
    public String toString() {
        return "Actor{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", birthDate='" + birthDate + '\'' +
                '}';
    }

异常:!java.lang.NullPointerException:null!在resources.ActorResource.postActor(ActorResource.java:31)…etc
表示java源文件第31行
ActorResource
中的代码引发了
NullPointerException

您将获得一个
NullPointerException
,因为您的代码在运行时试图调用对象上的方法,但该对象实际上是
null

因为我看不到
ActorResource
的行号,所以

  • 如果
    Actor=dao.create(新演员(姓名、生日))
    ActorResource
    的第31行,那么
    dao
    必须是
    null
    并调用
    dao。create(…)
    导致
    NullPointerException
    (这意味着
    dao
    尚未初始化)
  • 否则,如果
    返回新语句(“添加:“+actor.toString()”)
    ActorResource
    的第31行,那么
    actor
    必须是
    null
    并且调用
    actor.toString()
    会导致
    NullPointerException
    (这意味着
    dao.create(…)
    返回
    null

    • 例外:!java.lang.NullPointerException:null!在resources.ActorResource.postActor(ActorResource.java:31)…etc
      表示java源文件第31行
      ActorResource
      中的代码引发了
      NullPointerException

      您将获得一个
      NullPointerException
      ,因为您的代码在运行时试图调用对象上的方法,但该对象实际上是
      null

      因为我看不到
      ActorResource
      的行号,所以

      • 如果
        Actor=dao.create(新演员(姓名、生日))
        ActorResource
        的第31行,那么
        dao
        必须是
        null
        并调用
        dao。create(…)
        导致
        NullPointerException
        (这意味着
        dao
        尚未初始化)
      • 否则,如果
        返回新语句(“添加:“+actor.toString()”)
        ActorResource
        的第31行,那么
        actor
        必须是
        null
        并且调用
        actor.toString()
        会导致
        NullPointerException
        (这意味着
        dao.create(…)
        返回
        null

      您需要像这样的
      参数匹配器,请参见:

      或者您必须覆盖
      等于
      ,请参见:

      合理使用复杂的参数匹配。使用
      equals()
      和偶尔使用
      anyX()
      匹配器的自然匹配风格倾向于提供干净简单的测试。有时,最好重构代码,允许
      equals()
      匹配,甚至实现
      equals()
      方法来帮助测试


      您需要一个类似的
      ArgumentMatcher
      ,请参见:

      或者您必须覆盖
      等于
      ,请参见:

      合理使用复杂的参数匹配。使用
      equals()
      和偶尔使用
      anyX()
      匹配器的自然匹配风格倾向于提供干净简单的测试。有时,最好重构代码,允许
      equals()
      匹配,甚至实现
      equals()
      方法来帮助测试


      我添加了一些参与者详细信息,我填写了“toString()”方法中所需的所有字段,因为它是资源中使用的唯一方法。我添加了一些参与者详细信息,我填写了“toString()”方法中所需的所有字段,因为它是资源31行中使用的唯一方法。is
      return new say(“added:”+actor.toString())行。当(…)
      时,
      处的测试方法有问题吗?然后
      actor
      null
      ,这意味着
      dao。create(…)
      返回
      null
      。我建议添加一些日志记录和/或调试您的应用程序,以找出为什么.31行是
      返回新语句(“添加:“+actor.toString()”)行。当(…)
      时,
      处的测试方法有问题吗?然后
      actor
      null
      ,这意味着
      dao。create(…)
      返回
      null
      。我建议添加一些日志记录和/或调试您的应用程序,以找出原因。
      when(mock.addAll(argThat(new IsListOfTwoElements()))).thenReturn(true);