Вопрос по Spring

 
 
 
Сообщения:173
Взято отсюда: https://spring.io/guides/gs/validating-form-input/
Есть такая строчка:
 @PostMapping("/")
    public String checkPersonInfo(@Valid PersonForm personForm, BindingResult bindingResult) {

Поясните, откуда в метод контроллера попадёт personForm? Из модели? У меня выбрасывается NPE в похожих ситуациях.
Изменен:07 авг 2019 06:45
 
 
Сообщения:173
Дополнительный вопрос. В Spring данные из формы приходят в контроллер в виде модели? Или только через @RequestParam?
 
 
Сообщения:176
По первому вопросу. Значение полей personForm берётся из параметров URL (те, что после знака вопроса).
По дополнительному вопросу. Spring сам создаёт эту модель. А данные могут передаваться через @RequestParam, @RequestBody, @PathVariable.
 
 
Сообщения:173
1. То есть нигде предварительно не должен быть создан этот объект personForm, чтобы потом заполнить его переменные?
2. Из формы я не могу получить объект? Только параметры?

Контроллер:

@Controller
@RequestMapping(value = {"/accounts"})
public class AccountControler {
	
	@Autowired
	ClientService clientService;
	@Autowired
	AccountService accountService;
	
	@ModelAttribute("newAccount")
	public Account newAccount()
	{
		System.out.println("создаю новый счёт ");
		return new Account();
				
	   }
	

	@GetMapping
	public String accounts(@PageableDefault(page = 0, size = 10) Pageable pageable,Model model,HttpServletRequest req) {
		Client client = (Client) clientService.loadUserByUsername(req.getRemoteUser());
		model.addAttribute("client", client);
		Page<Account> page = accountService.findByClient(pageable, client);
		model.addAttribute("page", page);
	    int totalPages =page.getTotalPages();
        if (totalPages > 0) {
            List<Integer> pageNumbers = IntStream.rangeClosed(0, totalPages-1)
                .boxed()
                .collect(Collectors.toList());
            model.addAttribute("pageNumbers", pageNumbers);
        }
	    return "listAccounts";
	}
	
	@GetMapping("/{id}")
	public String accountOfClient(@PathVariable Long id,@PageableDefault(page = 0, size = 10) Pageable pageable,Model model) {
		Client client = clientService.findClientById(id);
		model.addAttribute("client", client);
		Page<Account> page = accountService.findByClient(pageable, client);
		model.addAttribute("page", page);
	    int totalPages =page.getTotalPages();
        if (totalPages > 0) {
            List<Integer> pageNumbers = IntStream.rangeClosed(0, totalPages-1)
                .boxed()
                .collect(Collectors.toList());
            model.addAttribute("pageNumbers", pageNumbers);
        }
	    return "listAccountsForAdmins";
	}
	
	@GetMapping("/addAccount/{id}")
	public String addAccount(@PathVariable Long id, Model model) {
		Client client = clientService.findClientById(id);
		model.addAttribute("client", client);
		return "addAccount";
	}
	
	@PostMapping("/addAccount/{id}")
	public String addNewAccount(@ModelAttribute("newAccount") @Valid Account account,BindingResult result,@PathVariable Long id, Model model) {
		if(result.hasErrors()) {
			 Client client = clientService.findClientById(id);
			 model.addAttribute("client", client);
			 return "addAccount";
	        }
		 else {
			 Client client = clientService.findClientById(id);
			 account.setClient(client);
			 accountService.save(account);
	return "redirect:/accounts/{id}";
	}
}
	
	@GetMapping("/deleteAccount/{accId}")
	public String deleteAccount(@PathVariable Long accId, Model model) {
		Long id = accountService.findAccountById(accId).getClient().getId();
		model.addAttribute("id", id);
		accountService.delete(accId);
		return "redirect:/accounts/{id}";
	}
	
	@GetMapping("/changeAccount/{id}")
	public String changeAccount(@PathVariable("id") Long id, HttpServletRequest request, Model model) {
		Account account = accountService.findAccountById(id);
		request.getSession().setAttribute("account", account);
		model.addAttribute("account", account);
		System.out.println(account);
		return "changeAccount";
	}
	
	@PostMapping("/update") 
	public String update(@ModelAttribute("account") @Valid Account account, BindingResult result,Model model,HttpServletRequest request) {
		System.out.println(account + "в пост");
		if(result.hasErrors()) {
			System.out.println(result.hasErrors());
			// model.addAttribute("account", account);
			 return "addAccount";
	        }
		 else {
			accountService.save(account);
			Long id = account.getClient().getId();
			return "redirect:/accounts/" + id;
	}
	}
	
}


Формы для нового счёта:
<form method="POST" th:action="@{/accounts/addAccount/{id}(id=${client.id})}" th:object="${newAccount}">
<label for="sum">Сумма: </label>
<input type="text" th:field="*{sum}" name="sum"/><br/>
<div th:if="${#fields.hasErrors('sum')}" th:errors="*{sum}">Name Error</div>
<input type="submit" value="Add"/>
</form>


Вопрос - как мне сделать форму для Update, чтобы происходила валидация введённых значений в полях формы?
 
 
Сообщения:176
1. Всё верно. Spring сам создаст его.
2. Можно. Но в вашем примере я не знаю как. Я с Thymeleaf не работал, не смогу подсказать.
Изменен:08 авг 2019 12:28
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет