【问题标题】:JSON Object gets null when trying to access尝试访问时 JSON 对象为空
【发布时间】:2017-11-02 08:42:31
【问题描述】:

我正在尝试生成一些地址来测试我的应用程序。 为此,我正在使用生成的 lat、lon 值查询一个 nominatim 接口。

我的代码如下,

方法一:

    @Override
    @QueryParam("count")
    public Response generateAddresses(@QueryParam("count") int count) {
        Border germany = em.createQuery("SELECT b from Border b where b.osmId=51477", Border.class).getSingleResult();
        Envelope boundingbox = germany.getGeometry().getEnvelopeInternal();
        double maxX = boundingbox.getMaxX();
        double maxY = boundingbox.getMaxY();
        double minX = boundingbox.getMinX();
        double minY = boundingbox.getMinY();
        int counter = 0;

        do {
            JsonObject response = generateAddress(maxX, maxY, minX, minY);

            if (response != null && !response.isEmpty()) {
                JsonObject address = response.getJsonObject("address");
                if (!address.getString("country_code").equals("de") || !address.containsKey("road")) {
                    continue;
                } else {
                    Stammdaten stamm = new Stammdaten();
                    stamm.setId(counter);
                    stamm.setLongtitude(Double.parseDouble(response.getString("lon")));
                    stamm.setLatitude(Double.parseDouble(response.getString("lat")));
                    stamm.setOsmId(response.getString("osm_id"));
                    stamm.setPlaceId(Integer.parseInt(response.getString("place_id")));
                    stamm.setPlz(address.getString("postcode"));
                    if (address.containsKey("city")) {
                        stamm.setOrt(address.getString("city)"));
                    } else if (address.containsKey("village")) {
                        stamm.setOrt( address.getString("village)"));
                    } else if (address.containsKey("town")) {
                        stamm.setOrt(address.getString("town"));
                    } else if (address.containsKey("city_district")) {
                        stamm.setOrt(address.getString("city_district)"));
                    }
                    stamm.setStrasse(address.getString("road"));
                    if (address.containsKey("house_number")) {
                        stamm.setHausnummer(address.getString("house_number"));
                    }
                    toDatabase(stamm, false);
                    counter++;
                }
            }
        } while (counter < count);

        return Response.ok().build();
    }

方法二:

private JsonObject generateAddress(double maxX, double maxY, double minX, double minY) {
    double lon = ThreadLocalRandom.current().nextDouble(minX, maxX);
    double lat = ThreadLocalRandom.current().nextDouble(minY, maxY);
    Coordinate c = new Coordinate(lon, lat);

    Client client = ClientBuilder.newClient();
    String nomiQuery = "?format=json&addressdetails=1&zoom=18&";
    nomiQuery = nomiQuery + "lat=" + lat + "&";
    nomiQuery = nomiQuery + "lon=" + lon;
    WebTarget target = client.target(GeoServer.nominatimServer + "/nominatim/reverse" + nomiQuery);

    JsonObject response = target.request(MediaType.TEXT_HTML).get(JsonObject.class);
    return response;
}

响应对象看起来像这样:

{
  "place_id": "17506237",
  "licence": "Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright",
  "osm_type": "way",
  "osm_id": "327659081",
  "lat": "50.0463769",
  "lon": "7.25918835238982",
  "display_name": "6, Oberstraße, Moritzheim, Zell (Mosel), Landkreis Cochem-Zell, Rhineland-Palatinate, 56865, Germany",
  "address": {
    "house_number": "6",
    "road": "Oberstraße",
    "village": "Moritzheim",
    "county": "Zell (Mosel)",
    "state": "Rhineland-Palatinate",
    "postcode": "56865",
    "country": "Germany",
    "country_code": "de"
  },
  "boundingbox": [
    "50.0462619",
    "50.0464746",
    "7.2590223",
    "7.2593789"
  ]
}

所以我的问题在于方法 1。当我寻找像 city 这样的键,然后尝试访问键 city 时,我得到了一个空指针。这就是说它无法访问变量响应。

疯狂的是空指针只发生在cityvillage。如果我访问 town 一切正常。

也许有人知道这里出了什么问题?

堆栈跟踪:

10:52:00,936 ERROR [org.jboss.as.ejb3.invocation] (default task-1) WFLYEJB0034: EJB Invocation failed on component GeocodeRepositoryBean for method public abstract javax.ws.rs.core.Response de.warzok.bachelor.geo.server.api.geocode.GeocodeRepository.generateAddresses(int): javax.ejb.EJBException: java.lang.NullPointerException
    at org.jboss.as.ejb3.tx.BMTInterceptor.handleException(BMTInterceptor.java:83)
    at org.jboss.as.ejb3.tx.EjbBMTInterceptor.checkStatelessDone(EjbBMTInterceptor.java:91)
    at org.jboss.as.ejb3.tx.EjbBMTInterceptor.handleInvocation(EjbBMTInterceptor.java:106)
    at org.jboss.as.ejb3.tx.BMTInterceptor.processInvocation(BMTInterceptor.java:58)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:437)
    at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:64)
    at org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:83)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:21)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
    at org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:52)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.ejb3.component.pool.PooledInstanceInterceptor.processInvocation(PooledInstanceInterceptor.java:51)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.ejb3.component.invocationmetrics.WaitTimeInterceptor.processInvocation(WaitTimeInterceptor.java:47)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.ejb3.security.SecurityContextInterceptor.processInvocation(SecurityContextInterceptor.java:100)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.ejb3.deployment.processors.StartupAwaitInterceptor.processInvocation(StartupAwaitInterceptor.java:22)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.java:64)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:67)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:54)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:64)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356)
    at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:636)
    at org.jboss.invocation.AccessCheckingInterceptor.processInvocation(AccessCheckingInterceptor.java:61)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356)
    at org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation(PrivilegedWithCombinerInterceptor.java:80)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
    at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:198)
    at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:185)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
    at org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:73)
    at de.warzok.bachelor.geo.server.api.geocode.GeocodeRepository$$$view8.generateAddresses(Unknown Source)
    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 org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:139)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:295)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:249)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:236)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:402)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:209)
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:221)
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
    at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
    at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
    at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
    at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
    at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
    at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
    at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:805)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
    at de.warzok.bachelor.geo.server.api.geocode.GeocodeRepositoryBean.generateAddresses(GeocodeRepositoryBean.java:120)
    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 org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:52)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:437)
    at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.doMethodInterception(Jsr299BindingsInterceptor.java:82)
    at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:93)
    at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.ejb3.component.invocationmetrics.ExecutionTimeInterceptor.processInvocation(ExecutionTimeInterceptor.java:43)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.jpa.interceptor.SBInvocationInterceptor.processInvocation(SBInvocationInterceptor.java:47)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.ejb3.tx.EjbBMTInterceptor.handleInvocation(EjbBMTInterceptor.java:103)
    ... 99 more

【问题讨论】:

    标签: java jax-rs wildfly geo


    【解决方案1】:

    2 个问题:

    1. 您在方法上有@QueryParam("count") 注释。这仅适用于您的参数,而不适用于方法声明。

    2. 你有一个NullPointerExceptionde.warzok.bachelor.geo.server.api.geocode.GeocodeRepositoryBean.generateAddresses(GeocodeRepositoryBean.java:120)

    根据您所说的,我假设address JSON 对象中的cityvillage 存在,但被分配为null。因此,为了防止NullPointerException,您必须像这样进行双重验证检查:

    if (address.containsKey("city") && !address.isNull("city")) {

    我希望这会有所帮助...

    【讨论】:

    • 感谢 QueryParam 的提示我改变了这个。双重检查不能修复空指针。调试器说这个领域有东西。在我使用setOrt()getString() 时,会抛出空指针。
    【解决方案2】:

    尽可能简单。这只是一个错字:

    ... 
    if (address.containsKey("city")) {
    stamm.setOrt(address.getString("city)"));
    } else if (address.containsKey("village")) {
    stamm.setOrt( address.getString("village)"));
    } else if (address.containsKey("town")) 
    ...
    

    应该是:

    ... 
    if (address.containsKey("city")) {
    stamm.setOrt(address.getString("city"));
    } else if (address.containsKey("village")) {
    stamm.setOrt( address.getString("village"));
    ...
    

    所以里面有错误的键... :(

    很抱歉浪费了您的时间。

    【讨论】:

      猜你喜欢
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多