Невозможно привязать флажки даже после регистрации редактора пользовательских свойств

У меня есть следующая последовательность шагов для регистрации команды:

  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>

person Aravind Yarram    schedule 06.06.2013    source источник


Ответы (1)


Одна проблема, которую я вижу, заключается в том, что вы вводите PlayerRepository внутри 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 и hashCode для своего класса Player. Я не проверял это, но полагаюсь на этот ответ

person zaboco    schedule 12.12.2013