问题描述
说我有两个不同的API:A和B,它们获得相同的POJOC。 POJO C具有2个不同的字段x和y。
public class C
{
String x;
String y;
}
是否可以设置一些条件验证注释, 因此,当将POJO c传递给API A时,只有字段x是必填字段, 而对于API B,x和y字段都是必填字段吗?
谢谢。
解决方法
您可以在这种情况下使用验证
例如:-
import javax.validation.constraints.NotEmpty;
public class C {
@NotEmpty
String X;
String Y;
}
您还可以决定使用@NotEmpty而不是@NotNull来检查它是否不为空。
在控制器级别,您可以使用以下内容:-
methodGet(@Valid @RequestBody final C c)
此methodGet =控制器级别的方法
,因为您要对同一个POJO进行不同的验证。您将必须使用自定义验证。
基本上,您将必须创建2个自定义注释。然后将这些注释应用于您各自的Apis。
您可以按照本教程进行操作。
,最简单的方法是使用验证组。请尝试:
控制器:
@RestController
public class FooController {
@PostMapping("/api1")
public Foo foo(@Validated(Api1Validated.class) Foo foo) {
return foo;
}
@PostMapping("/api2")
public Foo foo2(@Validated(Api2Validated.class) Foo foo) {
return foo;
}
}
域类:
@Data
public class Foo {
@NotEmpty(groups = {Api1Validated.class,Api2Validated.class})
private String name;
@NotNull(groups = {Api2Validated.class})
private Integer age;
}
验证接口:
public interface Api1Validated {
}
public interface Api2Validated {
}
单元测试:
@SpringBootTest
@AutoConfigureMockMvc
public class FooControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
@Test
public void test() throws Exception {
Foo foo = new Foo();
foo.setName("foo");
this.mockMvc.perform(post("/api1")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(foo)))
.andDo(print())
.andExpect(status().isOk());
this.mockMvc.perform(post("/api2")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(foo)))
.andDo(print())
.andExpect(status().isBadRequest());
}
}
版本:春季靴2.3.4,junit 5.7.0