2015-04-26 8 views
5

pals. Ich benutze die Bibliothek JTS (1.13) von vividsolutions für Punkte und Polygone in meiner Anwendung, aber wenn ich versuche, Geometrieobjekte in JSON zu konvertieren, schlägt meine Anwendung fehl. Es ist meine Quelle:Geometrie von vividsolutions JTS schlägt fehl beim Erstellen von JSON

@RequestMapping(value = "/test_point", method = RequestMethod.GET, produces = "application/json;charset=UTF-8") 
@ResponseBody 
public Map<String, Object> testPoint() { 

    Point point = geometryFactory.createPoint(new Coordinate(37.73, 60.45)); 

    return RequestMapBuilder.getInstance() 
      .addAttribute("point", point) 
      .build(); 
} 

Und es ist JSON ich vom Kunden empfangen:

{"point":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope":{"envelope": AND SO ON... 

Auch meine Anwendung diese Ausnahme auslöst:

java.lang.IllegalStateException: Cannot call sendError() after the response has been committed 
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:478) 
at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:129) 
at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:129) 
at org.springframework.security.web.context.SaveContextOnUpdateOrErrorResponseWrapper.sendError(SaveContextOnUpdateOrErrorResponseWrapper.java:92) 
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.sendServerError(DefaultHandlerExceptionResolver.java:313) 
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMessageNotWritable(DefaultHandlerExceptionResolver.java:370) 
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.doResolveException(DefaultHandlerExceptionResolver.java:140) 
at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:138) 
at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1183) 
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1020) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:316) 
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) 
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:122) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:149) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:168) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:48) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:205) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:120) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213) 
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176) 
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) 
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) 
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1517) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1474) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:744) 

Irgendwelche Ideen, was falsch ist? Danke im Voraus.

Antwort

2

Dies ist keine sehr nette Lösung, aber es hilft mir, das Problem zu lösen.

Also, Problem ist in Jackson Art und Weise zu JTS Polygon und Punkt Objekte zu serialisieren. Dieses Problem wurde vom Projekt jackson-datype-jts gelöst. Sie können diese Bibliothek Quellen auf Github zeigen - https://github.com/bedatadriven/jackson-datatype-jts

Alles, was ich brauche, um meine test_point laufen soll:

1) In Abhängigkeit und Repository für jackson-Datentyp-JTS:

<dependencies> 
    <dependency> 
     <groupId>com.bedatadriven</groupId> 
     <artifactId>jackson-datatype-jts</artifactId> 
     <version>1.0-SNAPSHOT</version> 
    </dependency> 

</dependencies> 

<repositories> 
    <repository> 
     <id>sonatype-oss</id> 
     <url>https://oss.sonatype.org/content/groups/public</url> 
    </repository> 
</repositories> 

2) Veränderung Quellcode auf diese Weise:

@RequestMapping(value = "/test_point", method = RequestMethod.GET, produces = "application/json;charset=UTF-8") 
@ResponseBody 
public Point testPoint() { 

    Point point =geometryFactory.createPoint(new Coordinate(37.77, 60.01)); 
    String result = ""; 
    ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.registerModule(new JtsModule()); 
    try { 
     result = objectMapper.writeValueAsString(point); 
    } catch (JsonProcessingException e) { 
     e.printStackTrace(); 
    } 

    return point; 
} 

Und das funktioniert wirklich, aber was möchte ich Punkt in meinem anderen POJO zurückkehren? Es gibt Lösung für Spring Framework: 1) Wiederholen Sie Schritt 1 aus vorherigen Abschnitt 2) Erstellen Sie eine Klasse erweitern ObjectMapper Klasse:

public class CustomMapper extends ObjectMapper { 

public CustomMapper() { 
    super(); 
    this.registerModule(new JtsModule()); 
} 
} 

3) Bearbeiten Sie Ihre Feder Config xml (für mich - servlet.xml) in nächste Zeichenfolgen:

<mvc:annotation-driven> 
     <mvc:message-converters> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter"/> 
      <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/> 
      <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
       <property name="objectMapper" ref="jacksonObjectMapper" /> 
      </bean> 
     </mvc:message-converters> 
    </mvc:annotation-driven> 

    <bean id="jacksonObjectMapper" class="ru.trollsmedjan.web.dao.CustomMapper"/> 

Jetzt wird Ihre ObjectMapper-Instanz durch Ihre Custom Object-Mapper-Realisation ersetzt. Ein es funktioniert!

2

Wenn Sie Frühlings-Boot verwenden, das ist genug:

pom.xml:

<dependency> 
    <groupId>com.bedatadriven</groupId> 
    <artifactId>jackson-datatype-jts</artifactId> 
    <version>2.3</version> 
</dependency> 

JacksonConfig.java:

package org.lskk.lumen.helpdesk; 

import com.bedatadriven.jackson.datatype.jts.JtsModule; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
public class JacksonConfig { 
    @Bean 
    public JtsModule jtsModule() { 
     return new JtsModule(); 
    } 
} 
+1

Dieser arbeitete für mich mit der letzten Ausgabe als '{ "type" : "Punkt", "Koordinaten": [1.0.1.0]} ' – rockoder

Verwandte Themen