2015-01-31 3 views
0

나는 스프링 부트를 사용하고 있으며 웹 응용 프로그램의 서비스 계층을 만들려고 노력하고 있지만 제대로 작동하지 않습니다.스프링 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); 
} 
} 

매번 나는 그것이 나에게 NullPointerException이 반환하는 모든 컨트롤러에서 ServiceFactory.getEncuestasService(). crearEncuesta()를 호출합니다.

필자가 읽었던 것으로부터 나는 내 ServiceFactory에 새로운 EncuestsaServiceImpl()을 작성해서는 안되지만 실제로 그렇게하는 올바른 방법을 모른다. 누군가 나를 도울 수 있다면 고맙겠습니다 : P.

편집 :

@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 컨테이너는 또한 구현을 필요로하는 bean에 인스턴스화하고 삽입 (autowire)하는 bean factory로 서버를 구성한다.

스프링은 서비스 인터페이스 구현을 인스턴스화하기 때문에 ServiceFactory가 필요하지 않습니다. 컨트롤러에서 참조 (필드)를 EncuestaService에 추가하고 Autowired으로 주석을 달아 구현시 와이어가 연결될 수 있도록해야합니다. 그런 다음 컨트롤러에서 사용할 수 있습니다.

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