【问题标题】:Spring MVC - How to create a proper Service layer?Spring MVC - 如何创建适当的服务层?
【发布时间】:2015-03-30 21:37:19
【问题描述】:

我正在使用 SpringBoot,我正在尝试为我的 Web 应用程序创建一个服务层,但我无法让它工作。

我的课是这样的

服务工厂

@Service
public class ServiceFactory {

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

Encuesta 服务

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() 时,它都会返回 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";
 }
}

【问题讨论】:

  • 显示你的配置文件。
  • 为什么需要ServiceFactory? Spring 将为您创建/注入 EncuestaService 实例。另外,请向我们展示您的控制器。
  • @Kresimir 我添加了控制器。

标签: spring-mvc service-layer


【解决方案1】:

您将不得不阅读更多关于依赖注入的内容。 Spring Framework 的核心原则是依赖注入,它应该用于避免静态引用 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";
 }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 2017-10-05
    • 2023-04-09
    • 2012-11-08
    • 1970-01-01
    相关资源
    最近更新 更多