{"componentChunkName":"component---src-templates-blog-post-js","path":"/spring-mongo/","result":{"data":{"markdownRemark":{"html":"<p>O objetivo desse post é criar uma aplicação de geolocalização, dizer quais pontos estão próximos de você por exemplo isso é muito útil se você uma empresa de entregas e precisa saber qual fornecedor está mais próximo para a entrega e várias aplicações do gênero. Para isso usarei aqui Spring Boot, pois tem toda uma facilidade para criação do projeto e uma comunidade e documentações muito ativas, MongoDB além de ser uma boa opção por toda a flexibilidade que ele trás também é muito útil nesse cenário onde vamos precisar fazer cálculos de geolocalização e ele nativamente possui isso.\nAqui faremos só o backend da aplicação e futuramente desenvolveremos o frontend.</p>\n<h2 id=\"Criando-a-aplicacao-Spring-Boot\" style=\"position:relative;\">Criando a aplicação Spring Boot<a href=\"#Criando-a-aplicacao-Spring-Boot\" aria-label=\"Criando a aplicacao Spring Boot permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Para isso vamos usar o <a href=\"https://start.spring.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Spring Initalizr</a>, entrando na página escolhemos como queremos iniciar o projeto, aqui eu irei usar o <em>Spring Web</em> para poder fazer requisições <em>Rest</em>, também estou usando <em>Lombok</em> e <em>Spring DevTools</em> mas são mais pela facilidade que o <em>Lombok</em> fornece quando criarmos os nossos <strong>POJOs</strong> e o <em>DevTools</em> para podermos usar em desenvolvimento e termos o live reload da aplicação.\nEntão fica mais ou menos assim o projeto:\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 49.079754601226995%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABf0lEQVQoz42RaU7EMAyFe/8jcQGENL+QgAFmJd3oOl2SJl3mkWcYhAQILLlLbD9/doI4C5FVKeZlAs7ANE/YHp+RZRnGccT57A+9aaNxOBzk3E0Ora2wix6x3txDqRB5nqOqKgRt1yBNEwx2kMJlWfy3wTRNmOf5U9AMxhcqRCpBFMW4fbnGze4Kx+IJdnBwo5PcoKwLEez7HnVdo+s67z2MMdBaizDNWosojrBJ7nEXrhDme9/dTzTOEiMIWwdVUyBOIySJpxwGGdM5JwlfzTrrG6d4Sm7xkK6QNspPYqUxBUknhMtyRtu2KMtS9nM6nYSMxHQSk9L4Hb4cFTZqDZXvYPUoMeYQhOuhBXzwgAslZdM0H2N30oj/JGYB9zgYC90bH3vP056QMRmZhBdB7k+FSigvTuqiKGSs/5gIsjuLqqrGfr/HdreVdxzH3wQve/rJLxbwEvK8QNnkODU1stdMdkhqCtGZ85fg56UwkQW8jGHU0K6Ds+7Hcb6+f7M3myoETQS0mooAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"spring initializr\"\n        title=\"spring initializr\"\n        data-src=\"/static/16a47eb88f89602575f32a3694d0cdd1/a6d36/spring-initializr.png\"\n        data-srcset=\"/static/16a47eb88f89602575f32a3694d0cdd1/222b7/spring-initializr.png 163w,\n/static/16a47eb88f89602575f32a3694d0cdd1/ff46a/spring-initializr.png 325w,\n/static/16a47eb88f89602575f32a3694d0cdd1/a6d36/spring-initializr.png 650w,\n/static/16a47eb88f89602575f32a3694d0cdd1/e548f/spring-initializr.png 975w,\n/static/16a47eb88f89602575f32a3694d0cdd1/cec12/spring-initializr.png 1187w\"\n        sizes=\"(max-width: 650px) 100vw, 650px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Após isso também precisamos adicionar ao projeto a dependência do <strong>google-service-maps</strong>, como estou usando <em>Maven</em></p>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre class=\"language-xml\"><code class=\"language-xml\"><span class=\"token comment\">&lt;!-- https://mvnrepository.com/artifact/com.google.maps/google-maps-services --></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>com.google.maps<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>google-maps-services<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>version</span><span class=\"token punctuation\">></span></span>0.11.0<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>version</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>Também adicione o driver do Mongo ao pom.</p>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre class=\"language-xml\"><code class=\"language-xml\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.mongodb<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>mongo-java-driver<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<h2 id=\"Descricao-da-aplicacao\" style=\"position:relative;\">Descrição da aplicação<a href=\"#Descricao-da-aplicacao\" aria-label=\"Descricao da aplicacao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Vamos emular uma rede entregas de alimentos, onde os estabelecimentos estão cadastrados e quando um usuário digitar o seu endereço e ele irá exibir os mais próximos dele.</p>\n<h2 id=\"Model\" style=\"position:relative;\">Model<a href=\"#Model\" aria-label=\"Model permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Vamos começar o nosso model com o que seria então o <strong>Estabelecimento</strong> ele possuirá <em>nome</em>, <em>email</em> e a sua <em>localização</em>. Então vou começar criando a classe <strong>Localizacao</strong>.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>model</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">java<span class=\"token punctuation\">.</span>util<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">List</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">lombok<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Data</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token annotation punctuation\">@Data</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Localizacao</span> <span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> endereco<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Double</span><span class=\"token punctuation\">></span></span> coordinates<span class=\"token punctuation\">;</span>    \n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> type <span class=\"token operator\">=</span> <span class=\"token string\">\"Point\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui temos o endereço mas também temos dois atributos que podem parecer um pouco estranhos o <em>coordinates</em> e o <em>type</em>. Os dois são necessários quando estamos trabalhando com geolocalização com o Mongo, o primeiro valor <em>coordinates</em> é uma lista de <strong>double</strong> contendo a latitude e longitude e o <em>type</em> diz respeito a um ponto no mapa, podemos ter outros <em>types</em> como <strong>Polygon</strong>.\nAgora criando a nossa classe do estabelecimento propriamente dita.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>model</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>annotation<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Id</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>mongodb<span class=\"token punctuation\">.</span>core<span class=\"token punctuation\">.</span>geo<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">GeoJsonPoint</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>mongodb<span class=\"token punctuation\">.</span>core<span class=\"token punctuation\">.</span>mapping<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Document</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">lombok<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Data</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">package</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>model</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span></span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">lombok<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Data</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token annotation punctuation\">@Datapublic</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Estabelecimento</span>\n\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">ObjectId</span> id<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> nome<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> email<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">Localizacao</span> localizacao<span class=\"token punctuation\">;</span>\t\n\t\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Temos aqui a classe <strong>Estabelecimento</strong> composta pela classe <strong>Localizacao</strong> e com os atributos <em>id</em> <em>lombok</em> nos ajuda a reduzir um pouco a verbozidade.</p>\n<h2 id=\"Codecs\" style=\"position:relative;\">Codecs<a href=\"#Codecs\" aria-label=\"Codecs permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Agora temos o <em>Model</em> criado mas precisamos fazer de alguma forma pra que a nossa aplicação se comunique com o <em>Mongo</em>. Aí entra os <em>codecs</em>, ele vai ser o responsável por fazer tanto o envio como o recebimento dos objetos do <em>Mongo</em>.\nEntão vamos criar a classe <strong>EstabelecimentoCodec</strong> que implementa a interface <strong>CollectibleCodec</strong> do tipo <strong>Estabelecimento</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>codec</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>bson<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">BsonReader</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>bson<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">BsonValue</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>bson<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">BsonWriter</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>bson<span class=\"token punctuation\">.</span>codecs<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">CollectibleCodec</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>bson<span class=\"token punctuation\">.</span>codecs<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">DecoderContext</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>bson<span class=\"token punctuation\">.</span>codecs<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">EncoderContext</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>model<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">EstabelecimentoCodec</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">CollectibleCodec</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">encode</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BsonWriter</span> writer<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Estabelecimento</span> value<span class=\"token punctuation\">,</span> <span class=\"token class-name\">EncoderContext</span> encoderContext<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token comment\">// TODO Auto-generated method stub</span>\n\t\t\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">Class</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">getEncoderClass</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token comment\">// TODO Auto-generated method stub</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">Estabelecimento</span> <span class=\"token function\">decode</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BsonReader</span> reader<span class=\"token punctuation\">,</span> <span class=\"token class-name\">DecoderContext</span> decoderContext<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token comment\">// TODO Auto-generated method stub</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">Estabelecimento</span> <span class=\"token function\">generateIdIfAbsentFromDocument</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Estabelecimento</span> document<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token comment\">// TODO Auto-generated method stub</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">boolean</span> <span class=\"token function\">documentHasId</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Estabelecimento</span> document<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token comment\">// TODO Auto-generated method stub</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">BsonValue</span> <span class=\"token function\">getDocumentId</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Estabelecimento</span> document<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token comment\">// TODO Auto-generated method stub</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Agora precisamos começar a implementar o codec a nossa maneira para ele poder fazer o encod e o decode, para isso vamos adicionar a classe <strong>Codec</strong> do pacote <em>bson</em> que nos ajuda, vamos tipa-la como um <strong>Document</strong> e vamos adicioná-lo ao construtor para ele ficar como dependência do nosso <em>codec</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>bson<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Document</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>bson<span class=\"token punctuation\">.</span>codecs<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Codec</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>model<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">EstabelecimentoCodec</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">CollectibleCodec</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">Codec</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Document</span><span class=\"token punctuation\">></span></span> codec<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">EstabelecimentoCodec</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Codec</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Document</span><span class=\"token punctuation\">></span></span> codec<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>codec <span class=\"token operator\">=</span> codec<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Agora vamos implementar o método responsável por fazer o encode. Aqui é onde dizemos como serão salvo os nossos objetos em Java para um objeto do Mongo:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Override</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">encode</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BsonWriter</span> writer<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Estabelecimento</span> estabelecimento<span class=\"token punctuation\">,</span> <span class=\"token class-name\">EncoderContext</span> encoder<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">Document</span> document <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Document</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    document<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"_id\"</span><span class=\"token punctuation\">,</span> estabelecimento<span class=\"token punctuation\">.</span><span class=\"token function\">getId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    document<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"nome\"</span><span class=\"token punctuation\">,</span> estabelecimento<span class=\"token punctuation\">.</span><span class=\"token function\">getNome</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    document<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"email\"</span><span class=\"token punctuation\">,</span> estabelecimento<span class=\"token punctuation\">.</span><span class=\"token function\">getEmail</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token class-name\">Localizacao</span> localizacao <span class=\"token operator\">=</span> estabelecimento<span class=\"token punctuation\">.</span><span class=\"token function\">getLocalizacao</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Double</span><span class=\"token punctuation\">></span></span> coordinates <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    localizacao<span class=\"token punctuation\">.</span><span class=\"token function\">getCoordinates</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span>coordinates<span class=\"token operator\">::</span><span class=\"token function\">add</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    document<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"localizacao\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Document</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"endereco\"</span><span class=\"token punctuation\">,</span> localizacao<span class=\"token punctuation\">.</span><span class=\"token function\">getEndereco</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"coordinates\"</span><span class=\"token punctuation\">,</span> coordinates<span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"type\"</span><span class=\"token punctuation\">,</span> localizacao<span class=\"token punctuation\">.</span><span class=\"token function\">getType</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    codec<span class=\"token punctuation\">.</span><span class=\"token function\">encode</span><span class=\"token punctuation\">(</span>writer<span class=\"token punctuation\">,</span> document<span class=\"token punctuation\">,</span> encoder<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E aqui é onde impletamos o decode, como o Java vai interpretar o objeto retornado do Mongo:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Override</span>\n<span class=\"token keyword\">public</span> <span class=\"token class-name\">Estabelecimento</span> <span class=\"token function\">decode</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BsonReader</span> reader<span class=\"token punctuation\">,</span> <span class=\"token class-name\">DecoderContext</span> decoderContext<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token class-name\">Document</span> document <span class=\"token operator\">=</span> codec<span class=\"token punctuation\">.</span><span class=\"token function\">decode</span><span class=\"token punctuation\">(</span>reader<span class=\"token punctuation\">,</span> decoderContext<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token class-name\">Estabelecimento</span> estabelecimento <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nestabelecimento<span class=\"token punctuation\">.</span>\n    estabelecimento<span class=\"token punctuation\">.</span><span class=\"token function\">setNome</span><span class=\"token punctuation\">(</span>document<span class=\"token punctuation\">.</span><span class=\"token function\">getString</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"nome\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    estabelecimento<span class=\"token punctuation\">.</span><span class=\"token function\">setEmail</span><span class=\"token punctuation\">(</span>document<span class=\"token punctuation\">.</span><span class=\"token function\">getString</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"email\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token class-name\">Document</span> localizacao <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">Document</span><span class=\"token punctuation\">)</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"localizacao\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>localizacao <span class=\"token operator\">!=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">String</span> endereco <span class=\"token operator\">=</span> localizacao<span class=\"token punctuation\">.</span><span class=\"token function\">getString</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"endereco\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token annotation punctuation\">@SuppressWarnings</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"unchecked\"</span><span class=\"token punctuation\">)</span>\n        <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Double</span><span class=\"token punctuation\">></span></span> coordinates <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Double</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">)</span> localizacao<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"coordinates\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token class-name\">Localizacao</span> localizacaoEntity <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Localizacao</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        localizacaoEntity<span class=\"token punctuation\">.</span><span class=\"token function\">setEndereco</span><span class=\"token punctuation\">(</span>endereco<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        localizacaoEntity<span class=\"token punctuation\">.</span><span class=\"token function\">setCoordinates</span><span class=\"token punctuation\">(</span>coordinates<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        estabelecimento<span class=\"token punctuation\">.</span><span class=\"token function\">setLocalizacao</span><span class=\"token punctuation\">(</span>localizacaoEntity<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token keyword\">return</span> estabelecimento<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E temos os outros métodos que implementamos para que o codec consiga fazer a gerência dos objetos:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Override</span>\n<span class=\"token keyword\">public</span> <span class=\"token class-name\">Class</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">getEncoderClass</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token annotation punctuation\">@Override</span>\n<span class=\"token keyword\">public</span> <span class=\"token class-name\">Estabelecimento</span> <span class=\"token function\">generateIdIfAbsentFromDocument</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Estabelecimento</span> estabelecimento<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">documentHasId</span><span class=\"token punctuation\">(</span>estabelecimento<span class=\"token punctuation\">)</span> <span class=\"token operator\">?</span> estabelecimento<span class=\"token punctuation\">.</span><span class=\"token function\">generateId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> estabelecimento<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token annotation punctuation\">@Override</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">boolean</span> <span class=\"token function\">documentHasId</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Estabelecimento</span> estabelecimento<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> estabelecimento<span class=\"token punctuation\">.</span><span class=\"token function\">getId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token annotation punctuation\">@Override</span>\n<span class=\"token keyword\">public</span> <span class=\"token class-name\">BsonValue</span> <span class=\"token function\">getDocumentId</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Estabelecimento</span> estabelecimento<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token function\">documentHasId</span><span class=\"token punctuation\">(</span>estabelecimento<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">IllegalStateException</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"This Document do not have a id\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">BsonString</span><span class=\"token punctuation\">(</span>estabelecimento<span class=\"token punctuation\">.</span><span class=\"token function\">getId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHexString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>A única coisa aqui a ressaltar foi a criação do método <em>generateId</em> no model <strong>Estabelecimento</strong> que fica assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>model</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span></span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">lombok<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Data</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token annotation punctuation\">@Datapublic</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Estabelecimento</span>\n\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">ObjectId</span> id<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> nome<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> email<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">Localizacao</span> localizacao<span class=\"token punctuation\">;</span>\t\n\t\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">Estabelecimento</span> <span class=\"token function\">generateId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">this</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"Repository\" style=\"position:relative;\">Repository<a href=\"#Repository\" aria-label=\"Repository permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Agora temos o <em>Model</em> e o <em>Codec</em> agora podemos criar o nosso <em>Repository</em> que irá fazer o acesso ao banco e ficará responsável por toda a gerência no Mongo.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>repository</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>stereotype<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Repository</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>mongodb<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">MongoClient</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>mongodb<span class=\"token punctuation\">.</span>client<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">MongoDatabase</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token annotation punctuation\">@Repository</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">EstabelecimentoRepository</span> <span class=\"token punctuation\">{</span>\n\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">MongoClient</span> client<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">MongoDatabase</span> mongoDataBase<span class=\"token punctuation\">;</span></code></pre></div>\n<p>Aqui criei a classe <strong>EstabelecimentoRepository</strong> e utilizei a annotation <em>@Repository</em> que diz ao <em>Spring</em> que essa classe fará a administração com o banco, aqui já adicionei o <strong>MongoClient</strong> que fará o registro do <em>Codec</em> e fará a conexão ao banco e o <strong>MongoDatabase</strong> que é quem será responsável por nos trazer a instância onde poderemos buscar nas nossos collections e fazer as transações.\nAgora vamos abrir a conexão com o banco de dados:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">\t<span class=\"token annotation punctuation\">@Value</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"${host}\"</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> host<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@Value</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"${port}\"</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> port<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@Value</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"${database}\"</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> database<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@Value</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"${collection.estabelecimento}\"</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> estabelecimento<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">MongoCollection</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">openConnetion</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token class-name\">Codec</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Document</span><span class=\"token punctuation\">></span></span> codec <span class=\"token operator\">=</span> <span class=\"token class-name\">MongoClient</span><span class=\"token punctuation\">.</span><span class=\"token function\">getDefaultCodecRegistry</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Document</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\t<span class=\"token class-name\">EstabelecimentoCodec</span> estCodec <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">EstabelecimentoCodec</span><span class=\"token punctuation\">(</span>codec<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\t<span class=\"token class-name\">CodecRegistry</span> registry <span class=\"token operator\">=</span> <span class=\"token class-name\">CodecRegistries</span><span class=\"token punctuation\">.</span><span class=\"token function\">fromRegistries</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">MongoClient</span><span class=\"token punctuation\">.</span><span class=\"token function\">getDefaultCodecRegistry</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n\t\t\t\t<span class=\"token class-name\">CodecRegistries</span><span class=\"token punctuation\">.</span><span class=\"token function\">fromCodecs</span><span class=\"token punctuation\">(</span>estCodec<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\t<span class=\"token class-name\">MongoClientOptions</span> options <span class=\"token operator\">=</span> <span class=\"token class-name\">MongoClientOptions</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">codecRegistry</span><span class=\"token punctuation\">(</span>registry<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>client <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">MongoClient</span><span class=\"token punctuation\">(</span>host <span class=\"token operator\">+</span> <span class=\"token string\">\":\"</span> <span class=\"token operator\">+</span> port<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>mongoDataBase <span class=\"token operator\">=</span> client<span class=\"token punctuation\">.</span><span class=\"token function\">getDatabase</span><span class=\"token punctuation\">(</span>database<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>mongoDataBase<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>estabelecimento<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">void</span> <span class=\"token function\">closeConnection</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>client<span class=\"token punctuation\">.</span><span class=\"token function\">close</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Fazendo uso da annotation <em>@Valeu</em> do Spring conseguimos recuperar o valor que está no <em>application.yml</em> contendo o <em>host</em>, a <em>port</em>, o <em>database</em> e o nome da <em>collection</em>.\nEntão basicamente registramos o <em>Codec</em> e conectamos no <strong>Mongo</strong> e já pegamos a nossa <em>collection</em> e já deixamos pronto o método para fechar a conexão.\nAgora vamos ao método que vai fazer a busca e agregação desses dados se baseando na proximidade.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">searchByGeolocation</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Filter</span> filter<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token class-name\">MongoCollection</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span> estabelecimentoCollection <span class=\"token operator\">=</span> <span class=\"token function\">openConnetion</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\t\testabelecimentoCollection<span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Indexes</span><span class=\"token punctuation\">.</span><span class=\"token function\">geo2dsphere</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"localizacao\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\t\t<span class=\"token class-name\">Point</span> referencePoint <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Point</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Position</span><span class=\"token punctuation\">(</span>filter<span class=\"token punctuation\">.</span><span class=\"token function\">getLat</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> filter<span class=\"token punctuation\">.</span><span class=\"token function\">getLng</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\t\t<span class=\"token class-name\">MongoCursor</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span> resultados <span class=\"token operator\">=</span> estabelecimentoCollection\n\t\t\t\t\t<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Filters</span><span class=\"token punctuation\">.</span><span class=\"token function\">nearSphere</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"localizacao\"</span><span class=\"token punctuation\">,</span> referencePoint<span class=\"token punctuation\">,</span> filter<span class=\"token punctuation\">.</span><span class=\"token function\">getDistance</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">limit</span><span class=\"token punctuation\">(</span>filter<span class=\"token punctuation\">.</span><span class=\"token function\">getLimit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">iterator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\t\t<span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span> estabelecimentos <span class=\"token operator\">=</span> <span class=\"token function\">fillEstabelecimento</span><span class=\"token punctuation\">(</span>resultados<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\t\t<span class=\"token keyword\">return</span> estabelecimentos<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span> <span class=\"token keyword\">finally</span> <span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token function\">closeConnection</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">fillEstabelecimento</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">MongoCursor</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span> resultados<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span> estabelecimentos <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>resultados<span class=\"token punctuation\">.</span><span class=\"token function\">hasNext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            estabelecimentos<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>resultados<span class=\"token punctuation\">.</span><span class=\"token function\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">return</span> estabelecimentos<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Então aqui abrimos a conexão com o método <em>openConnetion()</em> que nos devolve a nossa <em>collection</em> e como queremos fazer uma busca por proximidade adicionamos um índice e dizemos que o campo <em>localizacao</em> é do tipo <em>2dsphere</em> se tivessemos usando <strong>Mongo</strong> ficaria assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\">db.estabelcimento.createIndex(<span class=\"token punctuation\">{</span>\n    localizacao <span class=\"token operator\">:</span> <span class=\"token string\">\"2dsphere\"</span>\n<span class=\"token punctuation\">}</span>)</code></pre></div>\n<p>Isso o que fizemos é o que o <strong>Mongo</strong> nos obriga a fazer se quisermos fazer a busca por geolocalização.\nEm seguida criamos uma classe <strong>Point</strong> que recebe a <em>latitude</em> e a <em>longitude</em> e que será a baseado no nosso endereço quando passarmos. Como pegar a nossa latitude e longitude? Não se preocupe que iremos ver mais a seguir no momento só entenda que teremos esses valores pois é assim que poderemos trabalhar com geolocalização.\nAgora podemos disparar a nossa pesquisa:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">MongoCursor</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span> resultados <span class=\"token operator\">=</span> estabelecimentoCollection\n\t\t\t\t\t<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Filters</span><span class=\"token punctuation\">.</span><span class=\"token function\">nearSphere</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"localizacao\"</span><span class=\"token punctuation\">,</span> referencePoint<span class=\"token punctuation\">,</span> filter<span class=\"token punctuation\">.</span><span class=\"token function\">getDistance</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">limit</span><span class=\"token punctuation\">(</span>filter<span class=\"token punctuation\">.</span><span class=\"token function\">getLimit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">iterator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Aqui está a nossa busca, temos a nossa <em>collection</em> e usamos o método <em>find</em> só que passamos dentro dele os nossos filtros para a agregação com a classe <strong>Filter</strong> e seu método estático <em>nearSphere</em> que ele recebe o campo onde ele vai fazer a busca que no caso é <em>localizacao</em> o ponto de referencia que é o nosso <em>referencePoint</em> que nós criamos com a <em>latitude</em> e <em>longitude</em>, a máxima distância, em metros, da nossa pesquisa e a mínima distância; também passamos o <em>limit</em> de resultados e chamamos o <em>iterator</em> para podermos percorrers o que nos voltar do <strong>Mongo</strong>.\nCom um <strong>Iterator</strong> de resultados em mão podemos então percorrer o resultado, aqui separei no método <em>fillEstabelecimento</em> que devolve uma lista de <strong>Estabelecimento</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token keyword\">private</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">fillEstabelecimento</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">MongoCursor</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span> resultados<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span> estabelecimentos <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>resultados<span class=\"token punctuation\">.</span><span class=\"token function\">hasNext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            estabelecimentos<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>resultados<span class=\"token punctuation\">.</span><span class=\"token function\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">return</span> estabelecimentos<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"Service\" style=\"position:relative;\">Service<a href=\"#Service\" aria-label=\"Service permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Agora faremos a classe de serviço, que irá executar a nossa consulta ao banco através do <em>Repository</em> e que irá ser chamada pela nossa <em>Controller</em> que nos passará o endereço e nós iremos fazer a transformação dele em <em>latitude</em> e <em>longitude</em>, para isso usaremos a dependência <em>Google Maps</em> mas antes disso teremos que nos registrar no <strong>GCP - Google Cloud Platform</strong>, para isso será necessário criar um conta lá, não se preocupe com isso pois o <strong>Google</strong> dará um valor em créditos caso seja seu primeiro registro e após isso não cobrará nada sem seu consentimento prévio, após criar a conta acesse o <strong>Console</strong> habilitar a API <strong>Geocoding API</strong>:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 46.012269938650306%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsSAAALEgHS3X78AAABrElEQVQoz3VQy2oUQRTtP3AnCJoYFH9LNwqZED9JBB8L0UBCNIFAFB9bNdPRVWAQkp6kp7p7ul5dXf043lsz0+rCglP33qrDqXMqurUZ4852jLuPuZ5ifRRjbTTG9YcnuPbgO9Y2x7hHdytsbI3D/W2qNx4tOOujE+LHuHn/CNH+l1/Y/zzB3qcJXh39xNO9b3iy+xXP38V4cXAa6rMV3sZ4efgDb96fDdj5cIbXx4t+9+MEkdUFWqfRNxZoK6BzBKq9W/R9/ReWM5r/wCM6v0ggshxSaeRFiXkpIaVGKRWdmVAHEKcsVeCszkJf/uFEYiaQZRmMsSgLgbp2aNsW3jdQUlDfhNk5h0rOQ980LarKwFlDc0dzA2sttNaI0jRFkiTQxqDIBb04R9/34HWZzmgulyIeYnZFQlW4s1ZTMkEP1YE/CE6nU+R5EYiWwLXxfkmqKL4MDhiaUkglyb2nJB6W5rqu/3XIG8OQQ0tkFmu7LkS2ahFxFdmqIogx2KGrNTri8rcMgizEDbvLKVKRZ+FFXuLyHEqp4NZT5OzqYpiNlUhFEv6eRTkZ6/wGJ8OOrVHhuBcAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"gcp geocoding api\"\n        title=\"gcp geocoding api\"\n        data-src=\"/static/f4517619eaa4b4cfbfd2b0e3901511ce/a6d36/gcp-geocoding-api.png\"\n        data-srcset=\"/static/f4517619eaa4b4cfbfd2b0e3901511ce/222b7/gcp-geocoding-api.png 163w,\n/static/f4517619eaa4b4cfbfd2b0e3901511ce/ff46a/gcp-geocoding-api.png 325w,\n/static/f4517619eaa4b4cfbfd2b0e3901511ce/a6d36/gcp-geocoding-api.png 650w,\n/static/f4517619eaa4b4cfbfd2b0e3901511ce/e548f/gcp-geocoding-api.png 975w,\n/static/f4517619eaa4b4cfbfd2b0e3901511ce/3c492/gcp-geocoding-api.png 1300w,\n/static/f4517619eaa4b4cfbfd2b0e3901511ce/77f8f/gcp-geocoding-api.png 1353w\"\n        sizes=\"(max-width: 650px) 100vw, 650px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Após isso é necessário criar uma <strong>Apikey</strong> para que a sua aplicação possa se comunicar com o serviço que foi habilitado:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 26.993865030674847%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsSAAALEgHS3X78AAABIklEQVQY03WMy0pCURSGzzs0cRQagfVWETgxC98qohS6CIFZUdY09SgVpDYySz3Xvc/d87WPQdCgBR9rrX/969cKlT5b1QHFap/NfZ1CRSdf7pErdVnb7VDY67Jd1Ske9FZke77cZUP1XKnz68mVnljfaaLVWwOOm31qrWca7RGHlzq161fqt0OOrt6o3Qw5ab1wdj9SjDlX/aI9/uFhTEOR6Y3Hd07vhmhp7JPGHrAkqzSSJKFAOAbStVhGnkKuPD++hH8rjdBmps904WM6Ia6McF2b+WLB9POLyeQDV8gVjiuQno8fhAjprWbPD3BEiGEH6j/Asl207DibG2qxieIY0zRVqIsQAsMwCMPwD7HyJElCEKgQy8K2LaUHLJUmpeQbqH5Z8RSIeJ0AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"api key geo\"\n        title=\"api key geo\"\n        data-src=\"/static/b18b069e22b5583a50bc1d7371dd509d/a6d36/api-key-geo.png\"\n        data-srcset=\"/static/b18b069e22b5583a50bc1d7371dd509d/222b7/api-key-geo.png 163w,\n/static/b18b069e22b5583a50bc1d7371dd509d/ff46a/api-key-geo.png 325w,\n/static/b18b069e22b5583a50bc1d7371dd509d/a6d36/api-key-geo.png 650w,\n/static/b18b069e22b5583a50bc1d7371dd509d/e548f/api-key-geo.png 975w,\n/static/b18b069e22b5583a50bc1d7371dd509d/3c492/api-key-geo.png 1300w,\n/static/b18b069e22b5583a50bc1d7371dd509d/ad00e/api-key-geo.png 1366w\"\n        sizes=\"(max-width: 650px) 100vw, 650px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Agora a nossa apikey em mão já podmos começar a criar a classe <strong>EstabelecimentoService</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>service</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">java<span class=\"token punctuation\">.</span>io<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">IOException</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">java<span class=\"token punctuation\">.</span>util<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">List</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">java<span class=\"token punctuation\">.</span>util<span class=\"token punctuation\">.</span>stream<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Collectors</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>beans<span class=\"token punctuation\">.</span>factory<span class=\"token punctuation\">.</span>annotation<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Autowired</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>beans<span class=\"token punctuation\">.</span>factory<span class=\"token punctuation\">.</span>annotation<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Value</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>stereotype<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Service</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>dto<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">EstabelecimentoDTO</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>filter<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Filter</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>model<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>repository<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">EstabelecimentoRepository</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>google<span class=\"token punctuation\">.</span>maps<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">GeoApiContext</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>google<span class=\"token punctuation\">.</span>maps<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">GeocodingApi</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>google<span class=\"token punctuation\">.</span>maps<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">GeocodingApiRequest</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>google<span class=\"token punctuation\">.</span>maps<span class=\"token punctuation\">.</span>errors<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">ApiException</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>google<span class=\"token punctuation\">.</span>maps<span class=\"token punctuation\">.</span>model<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">GeocodingResult</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>google<span class=\"token punctuation\">.</span>maps<span class=\"token punctuation\">.</span>model<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Geometry</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>google<span class=\"token punctuation\">.</span>maps<span class=\"token punctuation\">.</span>model<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">LatLng</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token annotation punctuation\">@Service</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">EstabelecimentoService</span> <span class=\"token punctuation\">{</span>\n\n\t<span class=\"token annotation punctuation\">@Autowired</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">EstabelecimentoRepository</span> repository<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@Value</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"${apikey}\"</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> apikey<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">EstabelecimentoDTO</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">procuraEstabelecimentosProximoAMim</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> endereco<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> distance<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> limit<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n\t\t<span class=\"token class-name\">GeoApiContext</span> context <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">GeoApiContext</span><span class=\"token punctuation\">.</span><span class=\"token class-name\">Builder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">apiKey</span><span class=\"token punctuation\">(</span>apikey<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\t<span class=\"token class-name\">GeocodingApiRequest</span> request <span class=\"token operator\">=</span> <span class=\"token class-name\">GeocodingApi</span><span class=\"token punctuation\">.</span><span class=\"token function\">newRequest</span><span class=\"token punctuation\">(</span>context<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">address</span><span class=\"token punctuation\">(</span>endereco<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\t<span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token class-name\">GeocodingResult</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> results <span class=\"token operator\">=</span> request<span class=\"token punctuation\">.</span><span class=\"token function\">await</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token class-name\">GeocodingResult</span> resultado <span class=\"token operator\">=</span> results<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\t\t\t\n\t\t\t<span class=\"token class-name\">Geometry</span> geometry <span class=\"token operator\">=</span> resultado<span class=\"token punctuation\">.</span>geometry<span class=\"token punctuation\">;</span>\n\t\t\t\n\t\t\t<span class=\"token class-name\">LatLng</span> location <span class=\"token operator\">=</span> geometry<span class=\"token punctuation\">.</span>location<span class=\"token punctuation\">;</span>\n\t\t\t\n\t\t\t<span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">></span></span> estabelecimentoList <span class=\"token operator\">=</span> repository<span class=\"token punctuation\">.</span><span class=\"token function\">searchByGeolocation</span><span class=\"token punctuation\">(</span>\n\t\t\t\t\t<span class=\"token class-name\">Filter</span><span class=\"token punctuation\">.</span><span class=\"token function\">toFilter</span><span class=\"token punctuation\">(</span>location<span class=\"token punctuation\">.</span>lat<span class=\"token punctuation\">,</span> location<span class=\"token punctuation\">.</span>lng<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Double</span><span class=\"token punctuation\">.</span><span class=\"token function\">valueOf</span><span class=\"token punctuation\">(</span>distance<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Integer</span><span class=\"token punctuation\">.</span><span class=\"token function\">valueOf</span><span class=\"token punctuation\">(</span>limit<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\n\t\t\t<span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">EstabelecimentoDTO</span><span class=\"token punctuation\">></span></span> dtoList <span class=\"token operator\">=</span> estabelecimentoList<span class=\"token punctuation\">.</span><span class=\"token function\">stream</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>estabelecimento <span class=\"token operator\">-></span> <span class=\"token punctuation\">{</span>\n\t\t\t\t<span class=\"token keyword\">return</span> <span class=\"token class-name\">EstabelecimentoDTO</span><span class=\"token punctuation\">.</span><span class=\"token function\">toDTO</span><span class=\"token punctuation\">(</span>estabelecimento<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">collect</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Collectors</span><span class=\"token punctuation\">.</span><span class=\"token function\">toList</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\n\t\t\t<span class=\"token keyword\">return</span> dtoList<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">ApiException</span> <span class=\"token operator\">|</span> <span class=\"token class-name\">InterruptedException</span> <span class=\"token operator\">|</span> <span class=\"token class-name\">IOException</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\te<span class=\"token punctuation\">.</span><span class=\"token function\">printStackTrace</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\n\t\t<span class=\"token keyword\">return</span> <span class=\"token class-name\">List</span><span class=\"token punctuation\">.</span><span class=\"token function\">of</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Criamos o método <em>procuraEstabelecimentosProximoAMim</em> que recebe o <em>endereco</em>, a <em>distance</em> e o <em>limit</em>, em seguida criamos <strong>GeoApiContext</strong> usando a nossa <em>apikey</em> fazemos a nossa requisição para a o serviço do Google passando o nosso endereço como estamos fazendo tudo isso de forma síncrona ficamos esperando o retorno do serviço externo, isso por si só pode ocasionar muitos problema então todo o método <em>await</em> lança <strong>Exceptions</strong> que aqui não vamos nos aprofundar tratando-as.\nApós o retorno pegamos o resultado e navegamos no objeto de retorno até chegarmos onde queremos que é na <em>location</em> que é onde ele guarda a latitude e a longitude e agora podemos chamar o nosso <em>Repository</em> que irá executar a nossa busca.</p>\n<h2 id=\"Filter\" style=\"position:relative;\">Filter<a href=\"#Filter\" aria-label=\"Filter permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Um ponto de observação, você deve ter notado a classe <em>Filter</em> e o método <em>toFilter</em> na nossa <strong>Service</strong> e na <strong>Repository</strong> o <em>Filter</em> com <em>getLat</em>, <em>getLng</em>, <em>getDistance</em> e <em>getLimit</em>. Ele nos ajuda a não passar um valor muito grande variáveis na chamada de um método, segue:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Getter</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Filter</span> <span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">Filter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token keyword\">double</span> lat<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token keyword\">double</span> lng<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token keyword\">double</span> distance<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> limit<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token class-name\">Filter</span> <span class=\"token function\">toFilter</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">double</span> latitude<span class=\"token punctuation\">,</span> <span class=\"token keyword\">double</span> longitude<span class=\"token punctuation\">,</span> <span class=\"token keyword\">double</span> distance<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> limit<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token class-name\">Filter</span> filter <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Filter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tfilter<span class=\"token punctuation\">.</span>lat <span class=\"token operator\">=</span> latitude<span class=\"token punctuation\">;</span>\n\t\tfilter<span class=\"token punctuation\">.</span>lng <span class=\"token operator\">=</span> longitude<span class=\"token punctuation\">;</span>\n\t\tfilter<span class=\"token punctuation\">.</span>distance <span class=\"token operator\">=</span> distance <span class=\"token operator\">==</span> <span class=\"token number\">0</span> <span class=\"token operator\">?</span> <span class=\"token number\">1000.0</span> <span class=\"token operator\">:</span> distance<span class=\"token punctuation\">;</span>\n\t\tfilter<span class=\"token punctuation\">.</span>limit <span class=\"token operator\">=</span> limit <span class=\"token operator\">==</span> <span class=\"token number\">0</span> <span class=\"token operator\">?</span> <span class=\"token number\">10</span> <span class=\"token operator\">:</span> limit<span class=\"token punctuation\">;</span>\t\t\n\t\t\n\t\t<span class=\"token keyword\">return</span> filter<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"Controller\" style=\"position:relative;\">Controller<a href=\"#Controller\" aria-label=\"Controller permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Agora iremos criar a nossa <em>Controller</em> onde receberemos a requisição e devolveremos o resultado da pesquisa.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>controller</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">java<span class=\"token punctuation\">.</span>util<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">List</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>beans<span class=\"token punctuation\">.</span>factory<span class=\"token punctuation\">.</span>annotation<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Autowired</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>web<span class=\"token punctuation\">.</span>bind<span class=\"token punctuation\">.</span>annotation<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">GetMapping</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>web<span class=\"token punctuation\">.</span>bind<span class=\"token punctuation\">.</span>annotation<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">RequestMapping</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>web<span class=\"token punctuation\">.</span>bind<span class=\"token punctuation\">.</span>annotation<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">RequestParam</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>web<span class=\"token punctuation\">.</span>bind<span class=\"token punctuation\">.</span>annotation<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">RestController</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>dto<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">EstabelecimentoDTO</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>service<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">EstabelecimentoService</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token annotation punctuation\">@RestController</span>\n<span class=\"token annotation punctuation\">@RequestMapping</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"api\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">EstabalecimentoController</span> <span class=\"token punctuation\">{</span>\n\n\t<span class=\"token annotation punctuation\">@Autowired</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">EstabelecimentoService</span> service<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@GetMapping</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"estabelecimento\"</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">EstabelecimentoDTO</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">pegaEstabelecimentosProximosPeloEndereco</span><span class=\"token punctuation\">(</span>\n\t\t\t<span class=\"token annotation punctuation\">@RequestParam</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"limit\"</span><span class=\"token punctuation\">,</span> defaultValue <span class=\"token operator\">=</span> <span class=\"token string\">\"10\"</span><span class=\"token punctuation\">)</span> <span class=\"token class-name\">String</span> limit<span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token annotation punctuation\">@RequestParam</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"distancia\"</span><span class=\"token punctuation\">,</span> defaultValue <span class=\"token operator\">=</span> <span class=\"token string\">\"1000.00\"</span><span class=\"token punctuation\">)</span> <span class=\"token class-name\">String</span> distancia<span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token annotation punctuation\">@RequestParam</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"endereco\"</span><span class=\"token punctuation\">)</span> <span class=\"token class-name\">String</span> endereco<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> service<span class=\"token punctuation\">.</span><span class=\"token function\">procuraEstabelecimentosProximoAMim</span><span class=\"token punctuation\">(</span>endereco<span class=\"token punctuation\">,</span> distancia<span class=\"token punctuation\">,</span> limit<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Temos aqui a nossa <strong>EstabalecimentoController</strong> com unm método <em>pegaEstabelecimentosProximosPeloEndereco</em> e os parâmetros <em>limit</em> com um valor default de 10 caso não seja específicado na url, <em>distancia</em> com o valor de 1000.00, valor em metros e <em>endereco</em>.\nUma coisa interessante é que a nossa <em>Controller</em> não devolve o nosso <em>Model</em> pois não é considerado uma boa prática e até mesmo um falha de segurança dependedo da situação então o que devolvemos? Devolvemos um <strong>DTO</strong> (<em>Data Transfer Object</em>) que é um objeto <strong>POJO</strong> que só trafega dados como no exemplo:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>dto</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>geolocation<span class=\"token punctuation\">.</span>model<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Estabelecimento</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>fasterxml<span class=\"token punctuation\">.</span>jackson<span class=\"token punctuation\">.</span>annotation<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">JsonAutoDetect</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>fasterxml<span class=\"token punctuation\">.</span>jackson<span class=\"token punctuation\">.</span>annotation<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">JsonAutoDetect</span><span class=\"token punctuation\">.</span><span class=\"token class-name\">Visibility</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">lombok<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Getter</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token annotation punctuation\">@JsonAutoDetect</span><span class=\"token punctuation\">(</span>fieldVisibility <span class=\"token operator\">=</span> <span class=\"token class-name\">Visibility</span><span class=\"token punctuation\">.</span>ANY<span class=\"token punctuation\">,</span> getterVisibility <span class=\"token operator\">=</span> <span class=\"token class-name\">Visibility</span><span class=\"token punctuation\">.</span>NONE<span class=\"token punctuation\">,</span> setterVisibility <span class=\"token operator\">=</span> <span class=\"token class-name\">Visibility</span><span class=\"token punctuation\">.</span>NONE<span class=\"token punctuation\">)</span>\n<span class=\"token annotation punctuation\">@Getter</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">EstabelecimentoDTO</span> <span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">EstabelecimentoDTO</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> nome<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> email<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> endereco<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token class-name\">EstabelecimentoDTO</span> <span class=\"token function\">toDTO</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Estabelecimento</span> estabelecimento<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token class-name\">EstabelecimentoDTO</span> dto <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">EstabelecimentoDTO</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\tdto<span class=\"token punctuation\">.</span>nome <span class=\"token operator\">=</span> estabelecimento<span class=\"token punctuation\">.</span><span class=\"token function\">getNome</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tdto<span class=\"token punctuation\">.</span>email <span class=\"token operator\">=</span> estabelecimento<span class=\"token punctuation\">.</span><span class=\"token function\">getEmail</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tdto<span class=\"token punctuation\">.</span>endereco <span class=\"token operator\">=</span> estabelecimento<span class=\"token punctuation\">.</span><span class=\"token function\">getLocalizacao</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getEndereco</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\t\t\n\t\t\n\t\t<span class=\"token keyword\">return</span> dto<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>A única responsabilidade desse DTO é transformar um <strong>Estabelecimento</strong> em um DTO para ser retornado para a <em>Controller</em> e isso é feito dentro da nossa classe de <em>Service</em> no retorno da nossa <em>Repository</em>.</p>\n<h2 id=\"Resultado-final\" style=\"position:relative;\">Resultado final<a href=\"#Resultado-final\" aria-label=\"Resultado final permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Antes de testarmos precisamos fazer a inclusão de dados, então podemos inserir no Mongo os dados:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"nome\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Mercado I\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"email\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"contato@mercadoI.com\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"localizacao\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"endereco\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Rua Brigadeiro Tobias n 780\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"coordinates\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span> \n            <span class=\"token number\">-23.53624</span><span class=\"token punctuation\">,</span> \n            <span class=\"token number\">-46.63395</span>\n        <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"type\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Point\"</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">{</span>    \n    <span class=\"token property\">\"nome\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Estabelecimento II\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"email\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"contato@mercadoII.com\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"localizacao\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"endereco\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"R. Brg. Tobias, 206 - Santa Ifigênia, São Paulo - SP, 01032-000\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"coordinates\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span> \n            <span class=\"token number\">-23.54165</span><span class=\"token punctuation\">,</span> \n            <span class=\"token number\">-46.63583</span>\n        <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"type\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Point\"</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">{</span>    \n    <span class=\"token property\">\"nome\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Estabelecimento III\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"email\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"contato@mercadoIII.com\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"localizacao\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"endereco\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Av. Cásper Líbero, 42 - Centro Histórico De São Paulo, São Paulo - SP, 01033-000\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"coordinates\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span> \n            <span class=\"token number\">-23.54132</span><span class=\"token punctuation\">,</span> \n            <span class=\"token number\">-46.63643</span>\n        <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"type\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Point\"</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">{</span>    \n    <span class=\"token property\">\"nome\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Estabelecimento IV\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"email\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"contato@mercadoIV.com\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"localizacao\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"endereco\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Av. Rio Branco, 630 - República, São Paulo - SP, 01205-000\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"coordinates\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span> \n            <span class=\"token number\">-23.53984</span><span class=\"token punctuation\">,</span> \n            <span class=\"token number\">-46.64008</span>\n        <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"type\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Point\"</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">{</span>    \n    <span class=\"token property\">\"nome\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Estabelecimento V\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"email\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"contato@mercadoV.com\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"localizacao\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"endereco\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Alameda Barão de Limeira, 425 - Campos Elíseos, São Paulo - SP, 01202-900\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"coordinates\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span> \n            <span class=\"token number\">-23.53386</span><span class=\"token punctuation\">,</span> \n            <span class=\"token number\">-46.6482</span>\n        <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"type\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Point\"</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">{</span>    \n    <span class=\"token property\">\"nome\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Estabelecimento VI\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"email\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"contato@mercadoVI.com\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"localizacao\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"endereco\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"R. Canuto do Val, 41 - Santa Cecilia, São Paulo - SP, 01224-040\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"coordinates\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span> \n            <span class=\"token number\">-23.54062</span><span class=\"token punctuation\">,</span> \n            <span class=\"token number\">-46.65114</span>\n        <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"type\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Point\"</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Agora vamos fazer um teste manual usando o <em>Insomnia</em> um client para requisições HTTP, mas você usar qualquer um de sua prefência, PostMan, PostWoman, cUrl e etc.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 50.920245398773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABS0lEQVQoz3WSO1LDMBRFvZKEJJZkS5b/k7AFShoKJg3boKCmYYYFZAMUOP5gJ7C5iz6xY0hcnHnyG+n46Y6cp8d3bB/ecH/3ipfnHb5/OpRliaoqUdeVoar2aJoGdbvHR7tD8VmgKAocj0fFAd2hQ9t+oW5qOGkWIskCZLmEDD2s3JsBlyxMXa7mWCxnIGSJNI0hpAshFmBM75srZifmWhhjvcmVMFFCDs8nV/E5VZWCS4IwJVivKfKcIZBUnaMQATVrR0sC6aOvYwnz3H9idThiyJRss6GIYy0iCE7otRNGAj1aqCW9SATeILY9NYWKJcoI8owiiqzE5+efGqGe7powTqSR2m8rFCEzwls1YZqqCLgV9kwKuWBDb3x9LmyOMlRIO6FBjK48NeG1PJln15S5w94zE8JxbmP+5nmJ7k8KpybUz6fn8mkx/AIgu0SFHAScfAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"teste geo\"\n        title=\"teste geo\"\n        data-src=\"/static/137762ae175c1294cde7aef0f80f745a/a6d36/teste-geo.png\"\n        data-srcset=\"/static/137762ae175c1294cde7aef0f80f745a/222b7/teste-geo.png 163w,\n/static/137762ae175c1294cde7aef0f80f745a/ff46a/teste-geo.png 325w,\n/static/137762ae175c1294cde7aef0f80f745a/a6d36/teste-geo.png 650w,\n/static/137762ae175c1294cde7aef0f80f745a/e548f/teste-geo.png 975w,\n/static/137762ae175c1294cde7aef0f80f745a/3c492/teste-geo.png 1300w,\n/static/137762ae175c1294cde7aef0f80f745a/ad00e/teste-geo.png 1366w\"\n        sizes=\"(max-width: 650px) 100vw, 650px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Então fazendo a requisição <em><a href=\"http://localhost:8080/api/estabelecimento?endereco=R\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">http://localhost:8080/api/estabelecimento?endereco=R</a>. Brg. Tobias, 247</em>\nTemos a reposta:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"nome\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Estabelecimento II\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"email\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"contato@mercadoII.com\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"endereco\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"R. Brg. Tobias, 206 - Santa Ifigênia, São Paulo - SP, 01032-000\"</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"nome\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Estabelecimento III\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"email\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"contato@mercadoIII.com\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"endereco\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Av. Cásper Líbero, 42 - Centro Histórico De São Paulo, São Paulo - SP, 01033-000\"</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"nome\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Mercado I\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"email\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"contato@mercadoI.com\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"endereco\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Rua Brigadeiro Tobias n 780\"</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"nome\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Estabelecimento IV\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"email\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"contato@mercadoIV.com\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"endereco\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Av. Rio Branco, 630 - República, São Paulo - SP, 01205-000\"</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<h2 id=\"Projeto-Final\" style=\"position:relative;\">Projeto Final<a href=\"#Projeto-Final\" aria-label=\"Projeto Final permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>O projeto final você pode encontrar aqui <a href=\"https://github.com/guilhermegarcia86/geolocation\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">aqui</a></p>","fields":{"slug":"/spring-mongo/"},"frontmatter":{"date":"02 de setembro de 2020","description":"Criando uma aplicação Spring Boot com MongoDB e geolocalização","title":"Spring Boot e MongoDB","tags":["Java","Spring Boot","Mongo"],"author":"Guilherme Alves","image":{"id":"22af7b89-dfdb-52d4-bfab-7ac557f1b699","publicURL":"/static/f288a9a9083a534e7f1fc227790e9f22/mongodb-spring.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsSAAALEgHS3X78AAAA8ElEQVQY02P4jwr+/fuHwkVh/0NTzPAfA3z/9enrr3e///6A6P3w59ODt/fe//qIqZIByc6/QPLcs81tBxx7DvscfbgUyL305GJsrntCsXd0pvPx20eAIn/BylA0Q5z05ee7aSdjDj1YePftqecfb//4/2Hv+Z2h3ibZ6zO9PLXWH1wO0vz3D3bN77493Xi9Hcj48fvLkw9Xv/16+/jT05hMl/TOiIAkixsvrmO3Ga7/6su9Ky6VbbjWcvP1EUjg7bywNbXEf/2xlSA1f/8RCLC33x6//HLnH5INH35+/IsR1Fg0w+MDwfgHYqJFIQQAAFdQuKuXmY7bAAAAAElFTkSuQmCC","aspectRatio":2.6666666666666665,"src":"/static/f288a9a9083a534e7f1fc227790e9f22/0823f/mongodb-spring.png","srcSet":"/static/f288a9a9083a534e7f1fc227790e9f22/c67b7/mongodb-spring.png 320w,\n/static/f288a9a9083a534e7f1fc227790e9f22/d3930/mongodb-spring.png 640w,\n/static/f288a9a9083a534e7f1fc227790e9f22/0823f/mongodb-spring.png 1280w,\n/static/f288a9a9083a534e7f1fc227790e9f22/c730b/mongodb-spring.png 1920w,\n/static/f288a9a9083a534e7f1fc227790e9f22/2b61b/mongodb-spring.png 2000w","sizes":"(max-width: 1280px) 100vw, 1280px"}}}},"timeToRead":14}},"pageContext":{"slug":"/spring-mongo/","previous":{"fields":{"slug":"/conselhos/"},"frontmatter":{"title":"15 conselhos","date":"20 ago, 2020"}},"next":{"fields":{"slug":"/como-decidi-virar-desenvolvedora/"},"frontmatter":{"title":"Como decidi virar Desenvolvedora","date":"02 set, 2020"}}}},"staticQueryHashes":["63159454"]}