【问题标题】:How to fix NullPointerException in post request - Google Cloud Endpoints?如何修复发布请求中的 NullPointerException - Google Cloud Endpoints?
【发布时间】:2019-01-06 11:18:24
【问题描述】:

我正在尝试在 google 端点上创建一个 api 方法,在该端点上我接收请求正文中的数据,我希望将这些数据保存在数据存储区中。

但是,当我提出请求时,我得到以下响应:

{
    "error": {
        "errors": [
            {
                "domain": "global",
                "reason": "backendError",
                "message": "java.lang.NullPointerException"
            }
        ],
        "code": 503,
        "message": "java.lang.NullPointerException"
    }
}

请参考下面的api方法:

@ApiMethod(name="profile",
               path="profile",
               httpMethod=HttpMethod.POST)
    public UserProfile addUser(UserProfile userProfile) {

        userProfileService.addUser(userProfile);
        return userProfile;
    }

下面是我的dao类实现:

package com.travelplannr.endpoint.dao;

import com.googlecode.objectify.Objectify;
import com.googlecode.objectify.ObjectifyFactory;
import com.googlecode.objectify.ObjectifyService;
import com.travelplannr.endpoint.entities.UserProfile;

public class UserProfileDaoImpl implements UserProfileDao {

    static {
        factory().register(UserProfile.class);
    }

    public static Objectify ofy() {
        return ObjectifyService.ofy();
    }

    public static ObjectifyFactory factory() {
        return ObjectifyService.factory();
    }

    @Override
    public void addUser(UserProfile userProfile) {

        UserProfileDaoImpl.ofy().save().entity(userProfile).now();
    }

}

请参考下面的实体类:

package com.travelplannr.endpoint.entities;

import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;

@Entity
public class UserProfile {

    @Id
    private String email;
    private String name;
    private String password;

    public UserProfile() {}

    public UserProfile(String name, String email, String password) {
        this.name = name;
        this.email = email;
        this.password = password;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "UserProfile [name=" + name + ", email=" + email + ", password=" + password + "]";
    }
}

下面是堆栈跟踪:

java.lang.NullPointerException
    at com.travelplannr.endpoint.api.TravelPlannrApi.addUser(TravelPlannrApi.java:34)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:129)
    at com.google.api.server.spi.SystemService.invokeServiceMethod(SystemService.java:351)
    at com.google.api.server.spi.handlers.EndpointsMethodHandler$RestHandler.handle(EndpointsMethodHandler.java:119)
    at com.google.api.server.spi.handlers.EndpointsMethodHandler$RestHandler.handle(EndpointsMethodHandler.java:102)
    at com.google.api.server.spi.dispatcher.PathDispatcher.dispatch(PathDispatcher.java:49)
    at com.google.api.server.spi.EndpointsServlet.service(EndpointsServlet.java:71)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:72)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:134)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:48)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.DevAppServerRequestLogFilter.doFilter(DevAppServerRequestLogFilter.java:44)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:95)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:508)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

我还检查了在 api 方法中删除对 UserProfileService.add 的调用,只返回我在请求正文中收到的对象,它不为空。

请帮忙! 提前致谢。

【问题讨论】:

    标签: java google-cloud-datastore google-cloud-endpoints objectify


    【解决方案1】:

    您的帖子中缺少的上下文是 userProfileService 是如何初始化或首先被设置的(这超出了此 ApiMethod 的范围)。如果我理解正确,这似乎根本不是 Endpoints 的问题。这只是一条红鲱鱼。

    它可以通过暂时删除端点集成并确保您使用的任何注入框架/方法正确创建所有对象引用来帮助加快调试速度。也许创建一个小的 main() 方法来触发您的对象引导并检查以确保此 userProfileService 是非空的?这将允许您在命令行环境中更快地迭代,直到您在尝试使 Endpoints 集成正常工作之前找出初始化失败的根本原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      • 2014-07-10
      • 2018-12-18
      • 2023-04-02
      • 2019-07-11
      相关资源
      最近更新 更多