2017-06-01 30 views
0

我试图生成一些地址来测试我的应用程序。 为此,我使用生成的经纬度值查询一个nominatim接口。JSON对象在试图访问时得到空

我的代码如下,

方法1:

@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(); 
    } 

方法2:

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; 
} 

的Responseobject看起来像这样:

{ 
    "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" 
    ] 
} 

所以我会徽在Met hod 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 

回答

0

2个问题:

  1. 您对方法@QueryParam("count")注解。这只适用于你的参数而不是方法声明。

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

根据你说的话,我认为cityvillageaddress JSON对象是存在的,但被指定为null。因此,为了防止NullPointerException,你将不得不做双重验证检查,像这样:

如果(!address.containsKey( “城市”)& & address.isNull( “城市”)){

我希望这可以帮助...

+0

感谢。用QueryParam提示我改变了这个,双重检查并没有修复这个空指针,调试器说这个字段里有东西。当我使用'''setOrt()'''''getString()''时,抛出nullpointer。 – dominic

0

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

... 
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")); 
... 

因此就出现了在了错误的关键... :(

对不起,浪费你的时间