首先感謝大家誰試圖幫助我的:我試圖驗證列表與至少一個元素,如果我檢查使用驗證器接收空對象爲什麼?
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));
}
}
最後,這是發生了什麼,當我運行這個
首先,你可以請參閱使用一個元素的列表創建的團隊。 注意:助手創建一個球員並堅持它,然後添加到一個球隊並返回它,這是我們可以看到的團隊。
第二步,當它試圖堅持元素並通過驗證器時,列表爲空...¿爲什麼?
最後,當然,用一個空表,合併方法拋出一個異常:
什麼可能會發生任何想法?我不知道爲什麼會發生這種情況,正如你所看到的,我評論了其他行,測試通過可以,但不是當我嘗試更新時,它看起來是另一個對象,或者當對象再次實例化時
謝謝再次給大家
編輯:
的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;
}
編輯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只擴展它以提供一些方法,就像你在代碼中看到的一樣,但是現在我沒有更多的方法。在最後一張圖片中,您可以看到拋出異常的方法 –