Spring MVC - 如何创建合适的服务层?
Spring MVC - How to create a proper Service layer?
我正在使用 SpringBoot,我正在尝试为我的 Web 应用程序创建一个服务层,但我无法让它工作。
我的类长这样
服务工厂
@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);
}
}
每次我从任何控制器调用 ServiceFactory.getEncuestasService().crearEncuesta() 时,它 returns 给我一个 NullPointerException。
根据我的阅读,我不应该在我的 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";
}
}
您将需要阅读更多有关依赖注入的内容。 Spring 框架的核心原则是依赖注入,它应该用于避免静态引用 bean(服务实现、存储库实现等)。 Spring 容器也作为一个 bean 工厂服务,它将实例化和注入(自动装配)实现到需要它们的 bean。
因为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";
}
}
我正在使用 SpringBoot,我正在尝试为我的 Web 应用程序创建一个服务层,但我无法让它工作。
我的类长这样
服务工厂
@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);
}
}
每次我从任何控制器调用 ServiceFactory.getEncuestasService().crearEncuesta() 时,它 returns 给我一个 NullPointerException。
根据我的阅读,我不应该在我的 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";
}
}
您将需要阅读更多有关依赖注入的内容。 Spring 框架的核心原则是依赖注入,它应该用于避免静态引用 bean(服务实现、存储库实现等)。 Spring 容器也作为一个 bean 工厂服务,它将实例化和注入(自动装配)实现到需要它们的 bean。
因为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";
}
}