прежде всего спасибо за все, кто пытается помочь мне с этим: Я пытаюсь проверить список с, по меньшей мере, один элементом, если я проверю с помощьюВалидатор, получающий нулевые объекты ¿Почему?
Set<ConstraintViolation<Object>> constraintViolations = VALIDATOR.validate(anObj);
Ограничения работает отлично, но когда я пытаюсь упорствовать, объект с одним элементом пройти снова и список пустой ...
Это часть класса со списком:
public class Team implements Serializable {
//...
@AtLeastOneNotNull
@ManyToMany
@JoinTable(
name="teams_players"
, joinColumns={
@JoinColumn(name="id_team")
}
, inverseJoinColumns={
@JoinColumn(name="id_player")
}
)
private List<Player> players;
//...
}
валидатор:
public class AtLeastOneNotNullValidator implements ConstraintValidator<AtLeastOneNotNull, List<?>> {
@Override
public void initialize(AtLeastOneNotNull constraint) {
}
@Override
public boolean isValid(List<?> aCollection, ConstraintValidatorContext aConstraintValidatorContext) {
if(aCollection == null || aCollection.isEmpty())
return false;
else
return true;
}
}
Аннотация:
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = AtLeastOneNotNullValidator.class)
public @interface AtLeastOneNotNull {
String message() default "{[ERROR] Collection must have at least one element}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Класс испытаний:
public class TeamDAOTest {
private static Validator VALIDATOR;
TeamTestHelper teamTestHelper = null;
TeamDAO teamDaoTest = null;
@Before
public void initTestClass() {
teamDaoTest = new TeamDAO();
teamTestHelper = new TeamTestHelper();
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
VALIDATOR = factory.getValidator();
}
@After
public void endTestClass() {
}
@Test
public void savingRightTeam() {
Team testTeam = teamTestHelper.getTeamOK();
// Set<ConstraintViolation<Team>> constraintViolations = VALIDATOR.validate(testTeam);
//
// assertEquals(0, constraintViolations.size());
//
assertEquals("Inserting right Team", true, teamDaoTest.updateEntity(testTeam));
}
@Test
public void savingWrongTeam() {
Team testTeam = teamTestHelper.getTeamKO_WithoutPlayers();
// Set<ConstraintViolation<Team>> constraintViolations = VALIDATOR.validate(testTeam);
//
// assertEquals(1, constraintViolations.size());
assertEquals("Inserting empty Team", false, teamDaoTest.updateEntity(testTeam));
}
}
И, наконец, это то, что происходит, когда я запускаю этот
Прежде всего, вы можете см. команду, созданную с помощью списка с одним элементом. Примечание: Помощник создает игрока и сохраняет его в первую очередь, затем добавляет команду и возвращает ее, и это команда, которую мы можем видеть.
На втором этапе, когда он пытается сохранить элемент и проходит через валидатор, список пуст ... ¿почему?
И, наконец, конечно же, с нулевой список, метод слияния бросает исключение:
Любая идея о том, что могло случиться? Я не знаю, почему это происходит, как вы можете видеть, я прокомментировал другие строки, тест прошел нормально, но не тогда, когда я пытаюсь обновить, это похоже на другой объект или как объект снова создается снова.
Спасибо снова всем
EDIT:
getPlayer() и addPlayer() методы в объекте команды:
public List<Player> getPlayers() {
if(this.players == null)
this.players = new ArrayList<Player>();
return this.players;
}
public boolean addPlayer(Player aPlayer){
if(!getPlayers().contains(aPlayer)){
this.players.add(aPlayer);
return true;
}
else return false;
}
Edit 2: DAO, как вы можете видеть, теперь мне не нужно более конкретные методы в TeamDAO
public class TeamDAO extends AbstractDAOLayer<Team> {
}
метод UpdateEntity в AbstractDAOLayer
public boolean updateEntity(T anObject){
try{
this.beginTransaction();
this.entityManager.merge(anObject);
this.finishtTransaction();
return true;
}
catch(Exception e){
return false;
}
}
Не могли бы вы выслать код для TeamDAO.updateEntity? – Franck
Конечно, я добавил в последнем выпуске. Уровень DAO является абстрактным классом, TeamDAO только расширяет его, чтобы предоставить некоторые методы, как вы можете видеть в коде, но к настоящему времени у меня больше нет методов. На последнем изображении вы можете увидеть метод с Exception thrown –