0

我有以下注册团队的步骤序列:

  1. 选择球队 - 这将显示该球队的球员列表作为复选框(下面的 JSP 页面)
  2. 用户可以选择显示的一个或多个播放器
  3. 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>
4

1 回答 1

0

我看到的一个问题是你注入PlayerRepositoryinside PlayerPropertyEditor,这没有效果,因为它不在 Spring 上下文中。您应该通过构造函数传递它。然后将其注入Controller

玩家属性编辑器

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和。我没有测试过,但我依赖这个答案hashCodePlayer

于 2013-12-12T09:29:18.800 回答