2015-01-31 5 views
0

Я использую SpringBoot, и я пытаюсь создать сервисный уровень для своего веб-приложения, но я не могу заставить его работать.Spring MVC - Как создать надлежащий уровень сервиса?

Мои классы похожи на эту

ServiceFactory

@Service 
public class ServiceFactory { 

    @Autowired 
    public static EncuestaService getEncuestaService() 
    { 
    return new EncuestaServiceImpl(); 
    } 
} 

EncuestaService

public interface EncuestaService { 

void crearEncuesta(Encuesta encuesta, Map<String,String> parametros); 

} 

EncuestaServiceImpl

@Service 
public class EncuestaServiceImpl implements EncuestaService { 

@Override 
public void crearEncuesta(Encuesta encuesta, Map<String, String> parametros) { 
    CrearEncuesta nueva = new CrearEncuesta(encuesta,parametros); 
    nueva.execute(); 
    } 
} 

CrearEncuesta

@Service 
public class CrearEncuesta { 

private Encuesta encuesta; 
private Map<String,String> parametros; 

@Autowired 
private RespuestasRepository respuestasRepository; 
@Autowired 
private EncuestasRepository encuestasRepository; 

public CrearEncuesta(Encuesta encuesta, Map<String,String> parametros) { 
    super(); 
    this.encuesta = encuesta; 
    this.parametros = parametros; 
} 



public void execute() 
{ 
    encuestasRepository.save(encuesta); 
} 
} 

Everytime я называю ServiceFactory.getEncuestasService(). CrearEncuesta() из любого контроллера он возвращает мне NullPointerException.

Из того, что я читал, я не должен создавать новый EncuestsaServiceImpl() в моем ServiceFactory, но я действительно не знаю, как правильно это сделать. Буду признателен, если кто-нибудь сможет мне помочь: P.

Edit:

@SpringBootApplication 
public class Application { 

public static void main(String[] args) { 
    SpringApplication.run(Application.class, args); 
} 

Контроллер

@Controller 
public class EncuestaController { 
@RequestMapping(value ="registrarEncuesta", method = RequestMethod.POST) 
private String formularioEncuesta(@Valid @ModelAttribute("formEncuesta") EncuestaForm formEncuesta, BindingResult bindingResult,@RequestParam Map<String,String> allRequestParams) 
{ 
    if (bindingResult.hasErrors()) { 
      return "nuevaEncuesta"; 
     } 
     try { 
     Encuesta nueva = formEncuesta.toEncuesta(); 
     ServiceFactory.getEncuestaService().crearEncuesta(nueva,allRequestParams); 
     } catch (DataIntegrityViolationException e) { 
       return "nuevaEncuesta"; 
     } 
    return "redirect:/encuestas"; 
} 
} 
+0

показать конфигурационный файл. –

+0

Зачем вам ServiceFactory? Spring создаст/добавит экземпляр EncuestaService для вас. Также покажите нам свой контроллер. –

+0

@ Kresimir Я добавил контроллер. – QoP

ответ

0

Вы должны прочитать немного больше о зависимости инъекций. Центральным принципом Spring Framework является инъекция зависимостей, которая должна использоваться для предотвращения ссылок на bean-компоненты (реализации служб, реализаций репозитория и т. Д.) Статически. Весенний контейнер также является сервером как фабрика фасоли, которая будет создавать экземпляры и внедрять (autowire) реализации в нужные им компоненты.

Поскольку Spring создаст для вас реализацию интерфейса интерфейса, вам не потребуется ServiceFactory. В вашем контроллере вам нужно добавить ссылку (поле) в EncuestaService и аннотировать ее как Autowired, а Spring - в реализации. И тогда вы можете просто использовать его в своем контроллере.

@Controller 
public class EncuestaController { 

@Autowired 
EncuestaService encuestaService; 

@RequestMapping(value ="registrarEncuesta", method = RequestMethod.POST) 
private String formularioEncuesta(@Valid @ModelAttribute("formEncuesta") EncuestaForm formEncuesta, BindingResult bindingResult,@RequestParam Map<String,String> allRequestParams) 
{ 
    if (bindingResult.hasErrors()) { 
      return "nuevaEncuesta"; 
     } 
     try { 
     Encuesta nueva = formEncuesta.toEncuesta(); 
     encuestaService.crearEncuesta(nueva,allRequestParams); 
     } catch (DataIntegrityViolationException e) { 
       return "nuevaEncuesta"; 
     } 
    return "redirect:/encuestas"; 
} 
}