#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. Данные не сохраняются в базе данных после того, как я нажму кнопку Сохранить. Я обновил вопрос логикой хранения данных в базе данных.