CRUD - проблема с update-ом пользователей

380
27 марта 2017, 07:45

Приветствую! Делаю простое CRUD приложение, и столкнулся с проблемой update-а пользователей. The requested resource is not available - в данной теме помогли решить вопрос с запросами GET и POST. Но обновление пользователей всё равно не происходит, просто обновляется страница с update формой и всё. Ниже добавляю код и скриншоты работы программы.

Страница с update формой

После изменения информации в полях name, либо age и нажатия кнопки Save, просто обновляется страница, но изменения не уходят в базу, ниже выставляю исходных код

Класс UserController

    @Controller
public class UserControllerImpl implements UserController {
    private UserRepository repository;
    private UserValidator validator;
    @Autowired
    public UserControllerImpl(UserRepository repository, UserValidator validator) {
        this.repository = repository;
        this.validator = validator;
    }
    @RequestMapping(value = "/", method = RequestMethod.GET)
    @Override
    public String getUsers(ModelMap model) {
        List<User> users = this.repository.listAll();
        model.addAttribute("user", users);
        return "index";
    }
    @RequestMapping(value = "addUser", method = RequestMethod.GET)
    @Override
    public String addUser(ModelMap model) {
        return "addUser";
    }
    @RequestMapping(value = "addUser", method = RequestMethod.POST)
    @Override
    public String addUser(@RequestParam("name") String name, @RequestParam("age") String age, @RequestParam(value = "isAdmin",
    required = true, defaultValue = "false") Boolean isAdmin) {
        User user = new User(name, Integer.parseInt(age), isAdmin);
        user.setCreatedDate();
        this.repository.addUser(user);
        return "redirect:/";
    }
    @RequestMapping(value = "deleteUser/{id}", method = RequestMethod.GET)
    @Override
    public String deleteUser(@PathVariable Integer id) {
        this.repository.removeUser(id);
        return "redirect:/";
    }
    @RequestMapping(value = "updateUser/{id}", method = RequestMethod.GET)
    @Override
    public String getUpdate(@PathVariable Integer id, Model model) {
        model.addAttribute("userAttribute", this.repository.get(id));
        return "updateUser";
    }
    @RequestMapping(value = "updateUser/{id}", method = RequestMethod.POST)
    @Override
    public String postUpdate(@PathVariable Integer id, Model model) {
        model.addAttribute("userAttribute", this.repository.get(id));
        return "updateUser";
    }
}

Класс UserRepository

    @Repository
@Transactional
public class UserRepositoryImpl implements UserRepository {
    @Autowired
    SessionFactory sessionFactory;
    @Override
    public void addUser(User user) {
        Session session = sessionFactory.openSession();
        session.save(user);
    }
    @Override
    public User get(Integer id) {
        Session session = sessionFactory.getCurrentSession();
        User user = session.get(User.class, id);
        return user;
    }
    @Override
    public List<User> listAll() {
        Session session = sessionFactory.getCurrentSession();
        return session.createQuery("from User").list();
    }
    @Override
    public void removeUser(Integer id) {
        Session session = sessionFactory.getCurrentSession();
        User contact = session.load(User.class, id);
        if (null != contact) {
            session.delete(contact);
        }
    }
    @Override
    public void updateUser(User user) {
        Session session = sessionFactory.getCurrentSession();
        User existingUser = session.get(User.class, user.getId());
        existingUser.setName(user.getName());
        existingUser.setAge(user.getAge());
        existingUser.setAdmin(user.isAdmin());
        session.save(existingUser);
    }
}

Entity User

    @Entity
@Table(name = "users")
public class User {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Basic
    @Column(name = "name")
    private String name;
    @Basic
    @Column(name = "age")
    private Integer age;
    @Basic
    @Column(name = "isAdmin")
    private boolean isAdmin;
    @Basic
    @Column(name = "createdDate")
    @GeneratedValue
    private Timestamp createdDate;

    public User() {
    }
    public User(String name, boolean isAdmin) {
        this.name = name;
        this.isAdmin = isAdmin;
    }
    public User(String name, Integer age, boolean isAdmin) {
        this.name = name;
        this.age = age;
        this.isAdmin = isAdmin;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public boolean isAdmin() {
        return isAdmin;
    }
    public void setAdmin(boolean admin) {
        isAdmin = admin;
    }
    public Timestamp getCreatedDate() {
        return createdDate;
    }
    public void setCreatedDate() {
        this.createdDate = new Timestamp(System.currentTimeMillis());
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        if (id != user.id) return false;
        if (isAdmin != user.isAdmin) return false;
        if (name != null ? !name.equals(user.name) : user.name != null) return false;
        if (age != null ? !age.equals(user.age) : user.age != null) return false;
        return createdDate != null ? createdDate.equals(user.createdDate) : user.createdDate == null;
    }
    @Override
    public int hashCode() {
        int result = id;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        result = 31 * result + (age != null ? age.hashCode() : 0);
        result = 31 * result + (isAdmin ? 1 : 0);
        result = 31 * result + (createdDate != null ? createdDate.hashCode() : 0);
        return result;
    }
}

Файл updateUser.jsp - предполагаю, что конкретно с ним связана проблема

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%--
  Created by IntelliJ IDEA.
  User: Ar4er
  Date: 20.04.16
  Time: 16:27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Update User</title>
</head>
<body>
<c:url var="saveUrl" value="/updateUser/${userAttribute.id}"/>
<form:form modelAttribute="userAttribute" method="post" action="${saveUrl}">
<table>
    <tr>
        <td><form:label path="id">Id:</form:label></td>
        <td><form:input path="id" disabled="true" /></td>
    </tr>
    <tr>
        <td><form:label path="name">Name</form:label></td>
        <td><form:input path="name"/></td>
    </tr>
    <tr>
        <td><form:label path="age">Age</form:label></td>
        <td><form:input path="age"/></td>
    </tr>
    <%--<tr>--%>
        <%--<td><form:label path="isAdmin">Admin</form:label></td>--%>
        <%--<td><form:checkbox path="isAdmin"/></td>--%>
    <%--</tr>--%>
</table>
<input type="submit" value="Save"/>
</form:form>
</body>
</html>

Файл с инициализацией базы данных - PostgreSQL

    DROP TABLE IF EXISTS user;
DROP SEQUENCE IF EXISTS global_seq;
CREATE SEQUENCE global_seq START 100000;
CREATE TABLE users
(
  id         INTEGER PRIMARY KEY DEFAULT nextval('global_seq'),
  age        INTEGER ,
  name       VARCHAR NOT NULL,
  createdDate TIMESTAMP DEFAULT now(),
  isAdmin    BOOL DEFAULT TRUE
);

Есть еще index.jsp и addUser.jsp - в них всё работает корректно. Буду благодарен за помощь, если не хватает информации - пишите, что еще необходимо, буду добавлять ниже)

Answer 1

Вы можете повторить ваш код из addUser в postUpdate. Получиться примерно так.

@RequestMapping(value = "updateUser/{id}", method = RequestMethod.POST)
@Override
public String postUpdate(@RequestParam("name") String name, @RequestParam("age") String age, @PathVariable Integer id, Model model) {
    User user = repository.get(id);
    user.setName(name);
    user.setAge(age);
    repository.updateUser(user);
    return "redirect:/";
}
READ ALSO
Вызов конвейерной функции Oracle. WebJava

Вызов конвейерной функции Oracle. WebJava

Подскажите как правильно получить данные WebJava имея такую pipelined функцию:

392
Слайд-шоу с кнопками next и prev в Android

Слайд-шоу с кнопками next и prev в Android

Я хочу создать приложение Слайд-шоу, где тексты будут озвучиваться при клике на playНо не могу сделать так, что бы они соответственно находились...

321
Метод inflate() в Android

Метод inflate() в Android

Может кто доходчиво объяснить суть параметров метода inflaterinflate(int resource, ViewGroup root, boolean attachToRoot)? С первым вроде понятно, он по сути, преобразуется...

354
Как получить java object в thymeleaf через authentication

Как получить java object в thymeleaf через authentication

Я могу получить имя текущего пользователя <span sec:authentication="name">UserName</span>, а как получить полноценный объект что бы дергать у него любые...

429