Skip to content

correct structure in MVC with spring

I’m a little confused about correct mvc pattern.

This is my config file: In this class I’ve got all Beans.

@ComponentScan(basePackages = " name.web.controller")

    public UserRepo getUserService() {
        return new UserImpl(getDataSource());
    public BookRepo getBookService() {
        return new BookImpl(getDataSource());

This is my interface UserRepo, and interface UserService. They are the same

public interface UserService {
public String getUser();
void add(UserModel u);
UserModel getById(int id);
UserModel getByName(String name);
UserModel getByCognome(String surname);
Optional<UserModel> findOne(int id);
public void insert(User u);
public String giveName();
List<UserModel>ByNome(String nome);
List<UserModel> ByPassAndUsername(String password, String username);


I’ve got my class that implemets this interface

public class UserImpl extends AbstractDao<UserModel, Integer> implements UserRepo {
private EntityManager em;
public UserRepo userRepo;

private JdbcTemplate conn;
public void add(UserModel u) {
public UserImpl(DataSource ds) {
    conn= new JdbcTemplate(ds);
public UserModel getById(int id) {
    return em.find(UserModel.class, id);
public UserModel getByName(String nome) {
    CriteriaBuilder queryBuilder= em.getCriteriaBuilder();
    CriteriaQuery<UserModel> query= 
    Root<UserModel> rec= query.from(UseriModel.class);"nome"), nome));
     UserModel ut=em.createQuery(query).getSingleResult();
     return ut;
    //return em.find(UtentiModel.class, nome);

And finally I’ve got my Controller In my Controller I @Autowired UsersRepo/it’s a inteface/. And my code works, I can do all CRUD operations.

But, was told to me that this is not the right way. I can’t autowire directly. @Autowired of UserRepo, inside Controller class. So I search info on web, and I create a Service class. The Service it’s made so: have the same interface with the same methods that I wrote inside UserRepo Inteface. After I create the class that implements that interface, called UserSeviceImpl.

In userServiceImpl I go to @Autowire UserRepo interface, and after I go to @Autowire userService inside the Controller.

But now my code doesn’t work, Ive got 404 status in all pages in all Controlles: `The requested resource [/bookProject/] is not available

Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.`

I’ve got no errors inside Console, just info:

INFO: Command line argument: -Dfile.encoding=UTF-8
set 30, 2021 5:41:10 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The Apache Tomcat Native library which allows using OpenSSL was not found on the java.library.path: [/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib]
set 30, 2021 5:41:10 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
set 30, 2021 5:41:10 PM org.apache.catalina.startup.Catalina load
INFO: Server initialization in [624] milliseconds
set 30, 2021 5:41:10 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service [Catalina]
set 30, 2021 5:41:10 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet engine: [Apache Tomcat/9.0.50]
set 30, 2021 5:41:12 PM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
set 30, 2021 5:41:12 PM org.apache.catalina.core.ApplicationContext log
INFO: No Spring WebApplicationInitializer types detected on classpath
set 30, 2021 5:41:12 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory [/home/viktoriya/Scrivania/apache-tomcat-9.0.50/webapps/ROOT]
 set 30, 2021 5:41:12 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory [/home/viktoriya/Scrivania/apache-tomcat-9.0.50/webapps/ROOT] has finished in [13] ms
set 30, 2021 5:41:12 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
set 30, 2021 5:41:12 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in [2050] milliseconds

So I can not understand if I’m wrong to Autowire some bean, or if my current pattern is wrong, or if I need to change something in the config class, or if I have not applied the class of service well. Beacuse before my code was working well.

This is my controller: @Controller public class UserController { @Autowired private UserService us; List user; @GetMapping(“/new”) public ModelAndView new(Model model) {

UserModel users= new UserModel();
model.addAttribute("utenteForm", user);
return new ModelAndView("client", "utenteForm", new 
public ModelAndView sumbit(@ModelAttribute("utenteForm") UserModel users)

And this is UserServiceImpl:

public class UserServiceImpl implements UserService{
private final static Logger log= 
private UserRepo userRepo;
private EntityManager em;
public void add(UserModel u) {
public UserModel getByName(String name) {
    return userRepo.getByName(name);



I would say check your path that you are calling against the controller definition. I think it help if you update the code to see also the controller.


public class TestRestController{

  private TestService testService;

public class TestServiceImpl implements TestService {

  private TestRepository testRepository;

 public class TestRepositoryImpl implements TestRepository{
User contributions licensed under: CC BY-SA
9 People found this is helpful