Не отображать все поля из html в контроллер - PullRequest
0 голосов
/ 07 января 2020

Мне нужно обновить объект моей категории

моя модель:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;

@Entity
public class Category {
    @Id
    @GeneratedValue
    private int id;
    @NotNull
    private String name;
    private String description;
    @NotNull
    private Long created;
    private Long updated;

    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 Long getCreated() {
        return created;
    }

    public void setCreated(Long created) {
        this.created = created;
    }

    public Long getUpdated() {
        return updated;
    }

    public void setUpdated(Long updated) {
        this.updated = updated;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

Здесь мой контроллер:

@Controller
public class CategoryController {
    private CategoryRepository categoryRepository;

    private static Logger logger = LogManager.getLogger(CategoryController.class);

    // If class has only one constructore then @Autowired wiil execute automatically
    public CategoryController(CategoryRepository categoryRepository) {
        this.categoryRepository = categoryRepository;
        createStubCategoryList();
    }

    @PostMapping(value = "/category")
        public String submitCategory(Category category, Model model) {
            logger.info("updateCategory = " + category);
            model.addAttribute("submitted", true);
            model.addAttribute("category", category);
            categoryRepository.save(category);
            return "category";
        }

        @RequestMapping("category/edit/{id}")
        public String editCategory(@PathVariable("id") int id, Model model) {
            Optional<Category> category = categoryRepository.findById(id);
            logger.info("find_category = " + category);
            model.addAttribute("category", category);
            return "category";
        }

Здесь мой шаблон для редактирования категории:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title th:text="${appName}">Category template title</title>
    <link th:href="@{/public/style.css}" rel="stylesheet"/>
    <meta charset="UTF-8"/>
</head>
<body>
<div class="container">
    <form method="post" action="#" th:object="${category}" th:action="@{/category}">
        <h3>Category</h3>
        <input type="text" placeholder="name" id="name" th:field="*{name}"/>
        <textarea placeholder="Description of the category" rows="5" id="description"
                  th:field="*{description}"></textarea>
        <input type="submit" value="Submit"/>
    </form>

    <div class="result_message" th:if="${submitted}">
        <h3>Your category has been submitted.</h3>
        <p>Find all categories <a href="/categories">here</a></p>
    </div>
</div>
</body>
</html>

Когда метод вызова в журнале имеет:

[INFO ] 2020-01-07 19:38:07.493 [http-nio-8090-exec-8] CategoryController - find_category = Optional[
Category{id=2, name='Electronics', created=1578418669105, updated=null, description='Electronics's description'}]

и здесь экран:

enter image description here

Как вы можно увидеть поле созданный = 1578418669105

Ницца.

Теперь я изменяю имя «Электроника» на «Электроника2» и нажимаю «Отправить». Как результат вызов метода: submitCategory в моем контроллере. Хорошо.

Вот результат в журнале:

[INFO ] 2020-01-07 19:40:23.327 [http-nio-8090-exec-2] CategoryController - updateCategory = 
Category{id=0, name='Electronics2', created=null, updated=null, description='Electronics's description'}

, но, как вы можете видеть, поле создал пусто. Почему?

Мне нужно обновить только редактируемые поля: name и description .

Другие поля (например, созданы, обновлены, id ) не должно меняться. Эти поля не отображаются.

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 08 января 2020

Поскольку создан, обновлен, id нужно передавать как скрытый. Недоступно на странице html.

0 голосов
/ 07 января 2020

Каждый столбец должен быть изменен на обновляемый на false, потому что по умолчанию true.

@Column(name = "created", updatable = false)
private Long created;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...