Невозможно связать флажки даже после регистрации редактора пользовательских свойств
У меня есть следующая последовательность шагов для регистрации команды:
- Select Team - список игроков этой команды будет отображаться в виде флажков (страница JSP ниже)
- Пользователь может выбрать одного или нескольких отображаемых игроков
newdTeam
должен быть вызван метод обработчика запроса для установки выбранных игроков из шага 2 выше. Обработчик вызывается, ноplayers
набор пуст, даже если я выбрал игроков на шаге 2. Не уверен, где проблема.
Я не вижу вызванного редактора свойств. Любая помощь приветствуется.
команда
@NodeEntity
public class Team
{
@GraphId
private Long nodeId;
@GraphProperty
@Indexed (unique = true)
private String name;
@Fetch
@RelatedTo (type = "PLAYED_WITH_TEAM", direction = Direction.INCOMING)
private final Set<Player> players = new HashSet<Player>();
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = StringUtil.capitalizeFirstLetter(name);
}
public Long getNodeId()
{
return nodeId;
}
public Collection<Player> getPlayers()
{
return players;
}
public void setPlayers(Set<Player> plyrs)
{
System.err.println("called set plrs");
players.addAll(plyrs);
}
}
игрок
@NodeEntity
public class Player
{
@GraphId
private Long nodeId;
@Indexed (unique = true)
private String name;
@GraphProperty
@Indexed
private String firstName;
@GraphProperty
private String email;
//getters and setters
}
контроллер
@Controller
@RequestMapping ("/registration")
public class RegistrationController
{
private transient final Logger LOG = LoggerFactory.getLogger(getClass());
@Autowired
private LeagueRepository leagueRepo;
@Autowired
private TeamRepository teamRepo;
@RequestMapping (method = RequestMethod.GET)
public String get()
{
return "/registration/start";
}
@Transactional
@RequestMapping (value = "/start", method = RequestMethod.POST)
public String hasParticipatedEarlier(@RequestParam boolean participatedInEarlierLeague, Model model)
{
if (participatedInEarlierLeague)
{
LOG.debug("Participated in earlier leagues. Retrieving the past league teams.");
Iterable<League> allLeagues = leagueRepo.findAll();
Set<League> sortedLeagues = new TreeSet<League>();
for (League l: allLeagues)
{
sortedLeagues.add(l);
}
LOG.debug("Past leagues sorted by start date {}", sortedLeagues);
model.addAttribute("pastLeagues", sortedLeagues);
}
else
{
LOG.debug("Did not participate in earlier leagues. Redirecting to register the new one.");
}
return "/registration/leagues";
}
@RequestMapping (value = "/selectTeam", method = RequestMethod.POST)
public String selectTeam(@RequestParam Long selectedTeam, Model model)
{
LOG.debug("Participated as team {} in previous league", selectedTeam);
Team team = teamRepo.findOne(selectedTeam);
model.addAttribute("team", team);
model.addAttribute("players", team.getPlayers());
return "registration/players";
}
@RequestMapping (value = "/newTeam", method = RequestMethod.POST)
public String newdTeam(@ModelAttribute Team team, Model model)
{
LOG.debug("Selected players from existing list {}", team.getPlayers());
return "registration/registrationConfirmation";
}
@InitBinder
public void initBinder(WebDataBinder binder)
{
binder.registerCustomEditor(Player.class, new PlayerPropertyEditor());
}
}
PlayerPropertyEditor
public class PlayerPropertyEditor extends PropertyEditorSupport
{
@Autowired
PlayerRepository playerRepo;
@Override
public String getAsText()
{
System.err.println("get as txt");
return ((Player) getValue()).getNodeId().toString();
}
@Override
public void setAsText(String incomingId) throws IllegalArgumentException
{
System.err.println(incomingId);
Player player = playerRepo.findOne(Long.valueOf(incomingId));
setValue(player);
}
}
JSP
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<%@ taglib prefix="f" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Players of ${team.name}</title>
</head>
<body>
<f:form action="newTeam" method="post" modelAttribute="team">
<f:checkboxes items="${players}" path="players" itemLabel="name" itemValue="nodeId" delimiter="<br/>"/>
<input type="submit" value="Submit">
</f:form>
</body>
</html>
1 ответ
Одна проблема, которую я вижу, это то, что вы вводите PlayerRepository
внутри PlayerPropertyEditor
, который не имеет никакого эффекта, поскольку он не находится в контексте Spring. Вы должны передать его через конструктор. А затем ввести его в Controller
PlayerPropertyEditor
public class PlayerPropertyEditor extends PropertyEditorSupport
{
private PlayerRepository playerRepo;
public PlayerPropertyEditor(PlayerRepository playerRepo) {
this.playerRepo = playerRepo;
}
// other methods
}
внутри контроллера
@Autowired
private PlayerRepository playerRepo;
@InitBinder
public void initBinder(WebDataBinder binder)
{
binder.registerCustomEditor(Player.class, new PlayerPropertyEditor(playerRepo));
}
Во-вторых, и я думаю, что это главная проблема, это то, что вы должны переопределить equals
а также hashCode
для тебя Player
учебный класс. Я не проверял это, но я полагаюсь на этот ответ