Не удается добавить данные в базу данных, 404 не найдено для сопоставления

#java #spring

Вопрос:

У меня есть две сущности, два контроллера для этих сущностей, чистая конфигурация java для конфигурации spring. Один контроллер для сущности работает нормально, я могу добавлять данные в базу данных. Второй контроллер, который является тем же самым, просто другая сущность не будет работать, я не могу добавлять данные в базу данных.

Это EmployeeDetailController class:

   @Controller
@RequestMapping("/employeeDetail")
public class EmployeeDetailController {

    @Autowired
    private EmployeeService employeeService;


    @GetMapping("/listEmployeeDetail")
    public String listEmployeeDetail(Model theModel) {

        // get customers from the service
        List<EmployeeDetail> theEmployeeDetail = employeeService.listEmployeeDetail();

        // add the customers to the model
        theModel.addAttribute("employeeDetails", theEmployeeDetail);

        return "list-employeeDetail";
    }

    @GetMapping("/showFormForAddEmployeeDetail")
    public String showFormForAddEmployeeDetail(Model theModel) {

        // create model attribute to bind form data
        EmployeeDetail theEmployeeDetail = new EmployeeDetail();

        theModel.addAttribute("employeeDetail", theEmployeeDetail);

        return "addNewEmployeeDetailForm";
    }

    @PostMapping("/addNewEmployeeDetail")
    public String addNewEmployeeDetail(@ModelAttribute("employeeDetail") EmployeeDetail theEmployeeDetail) {

        // save the customer using our service
        employeeService.addNewEmployeeDetail(theEmployeeDetail);


        return "redirect:/employeeDetail/listEmployeeDetail";
    }

}
 

И это addNewEmployeeDetailForm.jsp часть кода для этого:

     <form:form action="addNewEmployeeDetail" modelAttribute="employeeDetail" method="POST">
 

Когда я запускаю его, приложение открывает мне форму для добавления данных, после того как я нажимаю «Сохранить», ее 404 не найдено.

В то время как это мой другой контроллер:

EmployeeController:

     @Controller
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    @GetMapping("/list")
    public String listEmployee(Model theModel) {

        // get customers from the service
        List<Employee> theEmployee = employeeService.listEmployee();

        // add the customers to the model
        theModel.addAttribute("employees", theEmployee);

        return "list-employee";
    }

    @GetMapping("/showFormForAdd")
    public String showFormForAdd(Model theModel) {

        // create model attribute to bind form data
        Employee theEmployee = new Employee();

        theModel.addAttribute("employee", theEmployee);

        return "addNewEmployeeForm";
    }

    @PostMapping("/addNewEmployee")
    public String addNewEmployee(@ModelAttribute("employee") Employee theEmployee) {

        // save the customer using our service
        employeeService.addNewEmployee(theEmployee);


        return "redirect:/employee/list";
    }
}
 

And addNewEmployeeForm.jsp part of code for form to add data:

     <form:form action="addNewEmployee" modelAttribute="employee" method="POST">
 

That works fine, while first controller doesnt work.

This is my DemoAppConfig:

 @Configuration
@EnableWebMvc
@ComponentScan("ets")
@EnableTransactionManagement
@PropertySource("classpath:persistence-mysql.properties")
public class DemoAppConfig implements WebMvcConfigurer {


    @Autowired
    private Environment env;

    private Logger logger = Logger.getLogger(getClass().getName());



    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Bean
    public ViewResolver viewResolver() {

        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();

        viewResolver.setPrefix("/WEB-INF/view/");
        viewResolver.setSuffix(".jsp");

        return viewResolver;
    }

    @Bean
    public DataSource dataSource() {

        // create connection pool
        ComboPooledDataSource myDataSource = new ComboPooledDataSource();

        // set the jdbc driver
        try {
            myDataSource.setDriverClass("com.mysql.jdbc.Driver");
        }
        catch (PropertyVetoException exc) {
            throw new RuntimeException(exc);
        }

        // for sanity's sake, let's log url and user ... just to make sure we are reading the data
        logger.info("jdbc.url="   env.getProperty("jdbc.url"));
        logger.info("jdbc.user="   env.getProperty("jdbc.user"));

        // set database connection props
        myDataSource.setJdbcUrl(env.getProperty("jdbc.url"));
        myDataSource.setUser(env.getProperty("jdbc.user"));
        myDataSource.setPassword(env.getProperty("jdbc.password"));

        // set connection pool props
        myDataSource.setInitialPoolSize(getIntProperty("connection.pool.initialPoolSize"));
        myDataSource.setMinPoolSize(getIntProperty("connection.pool.minPoolSize"));
        myDataSource.setMaxPoolSize(getIntProperty("connection.pool.maxPoolSize"));
        myDataSource.setMaxIdleTime(getIntProperty("connection.pool.maxIdleTime"));

        return myDataSource;
    }


    // need a helper method
    // read environment property and convert to int

    private int getIntProperty(String propName) {

        String propVal = env.getProperty(propName);

        // now convert to int
        int intPropVal = Integer.parseInt(propVal);

        return intPropVal;
    }

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(
                new String[]{"ets.entity"});
        sessionFactory.setHibernateProperties(hibernateProperties());

        return sessionFactory;
    }

    @Bean
    public PlatformTransactionManager hibernateTransactionManager() {
        HibernateTransactionManager transactionManager
                = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory().getObject());
        return transactionManager;
    }

    private final Properties hibernateProperties() {
        Properties hibernateProperties = new Properties();
        hibernateProperties.setProperty(
                "hibernate.hbm2ddl.auto", "update");
        hibernateProperties.setProperty(
                "hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");

        return hibernateProperties;
    }

}
 

EmployeeDAOImpl:

  @Override
public void addNewEmployeeDetail(EmployeeDetail theEmployeeDetail) {

    Session currentSession = sessionFactory.getCurrentSession();

    currentSession.saveOrUpdate(theEmployeeDetail);

}
 

EmployeeServiceImpl:

 @Override
@Transactional
public void addNewEmployeeDetail(EmployeeDetail theEmployeeDetail) {
    employeeDAO.addNewEmployeeDetail(theEmployeeDetail);
}
 

Я заметил, что в моем EmployeeDetails конструкторе класса сущностей:

 public EmployeeDetail(int workExperience, String hobby, String nationality) {
    this.workExperience = workExperience;
    this.hobby = hobby;
    this.nationality = nationality;
}
 

никогда не используется. В то время как используется конструктор из сущности Employee .

SQL

      use `etsystem`;

create table employee (
   employee_id BIGINT NOT NULL AUTO_INCREMENT,
   first_name VARCHAR(30) NOT NULL,
   last_name  VARCHAR(30) NOT NULL,
   email    VARCHAR(30) NOT NULL,
   PRIMARY KEY (employee_id)
);
 
 
create table employee_detail (
   employee_detail_id BIGINT NOT NULL,
   nationality VARCHAR(30) NOT NULL,
   hobby  VARCHAR(30) NOT NULL,
   work_experience  int(11) NOT NULL,
   PRIMARY KEY (employee_detail_id),
   CONSTRAINT employee_details FOREIGN KEY (employee_detail_id) REFERENCES employee (employee_id) ON DELETE NO ACTION ON UPDATE NO ACTION
);
 

Комментарии:

1. Ошибка 404 означает, что он не может найти эту страницу «список сотрудников». Проверьте свою базу данных, чтобы убедиться, что ваши данные были сохранены или нет. Если нет, поделитесь своей логикой обслуживания для хранения данных в базе данных.

2. Данные не сохраняются в базе данных после того, как я нажму кнопку Сохранить. Я обновил вопрос логикой хранения данных в базе данных.