Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

SpringMvc + AngularJs+ Heroku

Boa noite, estou construindo uma aplicação com spring + angularJs. Até o momento em que estava rodando e m um servidor local, estava tudo funcionando perfeitamente, porém ao tentar subir a aplicação no Heroku, não consigo acessar meus endpoints do meu controller, que se encontra assim:

package org.desafio.controllers;

import java.util.List;

import javax.validation.Valid;

import org.desafio.daos.RegistroDAO;
import org.desafio.model.Registro;
import org.desafio.validation.RegistroValidation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Controller
@RestController
@EnableWebMvc
@RequestMapping("registros")
public class RegistroController {

    @Autowired
    private RegistroDAO registroDAO;

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.addValidators(new RegistroValidation());
    }

    @RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    public List<Registro> listar() {
        return registroDAO.getAll();
    }

    @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public Registro pegarPorId(@PathVariable Integer id) {
        return registroDAO.getById(id);
    }

    @ResponseStatus(value=HttpStatus.OK)
    @RequestMapping(value = "/gravar", method = RequestMethod.POST)
    public @ResponseBody void cadastra(@Valid @RequestBody Registro registro, BindingResult result) {

        if(result.hasErrors()) {
            System.out.println("Não foi possível cadastrar o Produto!");
        }else {
            registroDAO.save(registro);            
        }

    }

    @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
    public void atualizar(@PathVariable Integer id, @RequestBody Registro registro) {
        registroDAO.update(registro, id);
    }

    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
    public void apagar(@PathVariable Integer id) {
        registroDAO.remove(id);
    }

}

Logo ao carregar a página, recebo o seguinte erro:

angular.js:12845 GET https://desafio-jiva-nilson.herokuapp.com/desafio/registros 404 (Not Found)

sendo "desafio" o nome da minha aplicação, e "/registros" meu endpoint para pegar a lista de Registros no formato JSON.

Algém pode me dar uma luz ?

3 respostas

Consegui resolver o problema, colocando o caminho absoluto no RequestMap do controller, mudando de :

@Controller
@RestController
@EnableWebMvc
@RequestMapping("registros")
public class RegistroController {
...
//restante do código

para:

@Controller
@RestController
@EnableWebMvc
@RequestMapping("desafio/registros")
public class RegistroController {

Mas estou com essa dúvida de se sempre que for mudar de um servidor local como Apache ou Wildfly para algum como o Heroku, terei que fazer estas mudanças nos detalhes, ou se existe um modo de fazer que seja genérico para funcionar perfeitamente em qualquer servido...

solução!

Acho que eu não entendi o problema. REalmente você não deveria fazer nenhuma alteração nos seus mapeamentos em função do servidor que você está deployando.

Realmente, eu não soube me expressar muito bem. Mas era bem isso mesmo o problema, o fato de que tive que fazer mudanças no path do meu controller para funcionar corretamente no servidor...