我对java非常陌生,我刚刚创建了一个spring引导应用程序来进行一些练习。
我创建了一个用json接收post请求的控制器:
{
"team1": {
"score": 10,
"colour": "RED"
},
"team2": {
"score": 3,
"colour": "BLUE"
}
}
控制器:
public @ResponseBody
ResponseEntity<Response<Game>> saveGame(
@Valid @RequestBody PostedGameRequest postedGameRequest
) {
// ...
}
postedgamerequest得到验证,这很正常,但是有两个属性:类型为postedgamerequestteam的team1和team2,它们没有得到验证。我加了一些 @NotEmpty
属性在里面,但那不起作用。
所以现在我创建了一个定制的teamvalidator,它验证团队中的字段,但是当它失败时,它将只显示我在 @Team
属性类。如果我能自己验证每个字段就好了。
@Builder
public class PostedGameRequest {
@Team()
private final PostedGameRequestTeam team1;
@Team()
private final PostedGameRequestTeam team2;
public PostedGameRequestTeam getTeam1() {
return team1;
}
public PostedGameRequestTeam getTeam2() {
return team2;
}
}
public class TeamValidator implements ConstraintValidator<Team, PostedGameRequestTeam> {
List<String> colours = Arrays.asList("RED","BLUE");
@Override
public boolean isValid(@Valid PostedGameRequestTeam team, ConstraintValidatorContext context) {
if (team == null || team.getColour() == null || team.getScore() == null) {
return false;
}
if (team.getScore() < 0 || team.getScore() > 11) {
// This will only lead to an invalid team message, should get a message about the score in this case
return false;
}
if (!colours.contains(team.getColour())) {
// This will only lead to an invalid team message, should get a message about the colour in this case
return false;
}
return (team.getId() != null || team.getName() != null);
}
}
我有一种感觉,我做这件事不是我应该做的。为什么我的第一种方法不起作用?有什么我必须添加的,使验证器也运行的team1和team2属性没有我添加一个自定义验证器 @Team
?
2条答案
按热度按时间au9on6nz1#
而不是
@NotEmpty
尝试这将确保team1和team2始终包含一个不为null的对象
如果您想对team1和team2的每个属性进行更多的验证,请在java中进入该对象并向这些字段添加更多注解。对于
string
可以添加的属性这将确保它始终包含一个值
另外,要进入验证的一步,只需添加
@Valid
所以你的目标会变成然后在里面
编辑:
@Size
仅适用于字符串字段,不适用于自定义对象68bkxrlz2#
而不是用你的
@Team
处理所有验证逻辑的自定义验证器(我认为在本例中这不是很有用),您应该在每个验证器中分别声明您的验证注解PostedGameRequestTeam
对象。注意我用了
@Min
以及@Max
注解,那是因为javax.validation.constraints.Size
仅验证字符串的长度。现在可以添加的自定义约束验证
@TeamColour
.然后,你应该加上
@NotNull
属性,以便验证具有team
对象。此逻辑处理您要使用的所有级联验证。