我有以下注册团队的步骤序列:
- 选择球队 - 这将显示该球队的球员列表作为复选框(下面的 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());
}
}
玩家属性编辑器
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>