Java Spring引导中的条件JSON请求映射
我有一个带有URLJava Spring引导中的条件JSON请求映射,java,spring-boot,spring-data-jpa,Java,Spring Boot,Spring Data Jpa,我有一个带有URLhttp://my-custom-url/{param} 现在 除了映射之外,我的模型类es中还有Jsr303验证,因此我还希望使用@Valid注释 如何执行此操作您可以通过映射接收有效负载,并使用对象映射器对其进行反序列化 @RestController @RequestMapping(path = "/my-rest-api") public class MyController { @Autowired ClassAValidator classAVal
http://my-custom-url/{param}
现在
除了映射之外,我的模型类es中还有Jsr303验证,因此我还希望使用@Valid注释
如何执行此操作您可以通过
映射
接收有效负载,并使用对象映射器
对其进行反序列化
@RestController
@RequestMapping(path = "/my-rest-api")
public class MyController {
@Autowired
ClassAValidator classAValidator; // assuming you wrote an validator
@Autowired
ClassBValidator classBValidator; // assuming you wrote an validator
@PostMapping("/{parameter}")
public ResponseEntity<Object> handleRequest(
@PathVariable("parameter") String parameter,
@RequestBody Map<Object, Object> request,
BindingResult result) {
ObjectMapper mapper = new ObjectMapper();
if (parameter.equals("X")) {
ClassA classA = mapper.convertValue(request, ClassA.class);
classAValidator.validate(classA, result);
if(result.hasErrors()) {
throw new CustomException(result);
}
} else if (parameter.equals("Y")) {
ClassB classB = mapper.convertValue(request, ClassB.class);
classBValidator.validate(classB, result);
if(result.hasErrors()) {
throw new CustomException(result);
}
} else {
// ..
}
return ResponseEntity.ok("Ok");
}
}
@RestController
@RequestMapping(路径=“/MyRESTAPI”)
公共类MyController{
@自动连线
ClassAValidator ClassAValidator;//假设您编写了一个验证器
@自动连线
ClassBValidator ClassBValidator;//假设您编写了一个验证器
@后映射(“/{parameter}”)
公共响应HandlerRequest(
@PathVariable(“参数”)字符串参数,
@请求体映射请求,
BindingResult(结果){
ObjectMapper mapper=新的ObjectMapper();
if(参数等于(“X”)){
ClassA ClassA=mapper.convertValue(请求,ClassA.class);
验证(classA,结果);
if(result.hasErrors()){
抛出新的CustomException(结果);
}
}else if(参数等于(“Y”)){
ClassB ClassB=mapper.convertValue(请求,ClassB.class);
验证(classB,结果);
if(result.hasErrors()){
抛出新的CustomException(结果);
}
}否则{
// ..
}
返回响应。ok(“ok”);
}
}
我认为这是一个更简单的解决方案:
@RestController
@RequestMapping("/my-custom-url")
public class MyController {
@PostMapping("/param1")
public ResponseEntity<Object> handleClassA(
@Valid @RequestBody ClassA classA,
BindingResult result) {
...
return ResponseEntity.ok("Ok");
}
@PostMapping("/param2")
public ResponseEntity<Object> handleClassB(
@Valid @RequestBody ClassB classB,
BindingResult result) {
...
return ResponseEntity.ok("Ok");
}
}
@RestController
@RequestMapping(“/my自定义url”)
公共类MyController{
@后映射(“/param1”)
公共责任手册(
@有效@RequestBody ClassA ClassA,
BindingResult(结果){
...
返回响应。ok(“ok”);
}
@后映射(“/param2”)
公共责任手册B(
@有效@RequestBody ClassB ClassB,
BindingResult(结果){
...
返回响应。ok(“ok”);
}
}
我不知道为什么上面的答案解释了验证器。据我所知,您试图根据条件返回两种类型的响应。这是不可能的。因为返回类型在编译时验证。所以,如果将返回类型设置为classA,则必须返回classA。您不能返回classB。(除非classB是classA关系),所以如果您真的想这样做,您可以使用name接口来强制执行该类型
@GetMapping(value=“/{id}”)
公共响应getRent(@PathVariable int-id、@RequestParam(required=false)字符串类型){
如果(类型=“A”){
返回新的ClassA(rentService.findById(id));
}否则{
返回新的ClassB(rentService.findDetailResponse(id));
}
}
附言:您可能需要将此作为
公共响应
但我只是直接用了回应
现在您需要从同一个接口创建这两个类
公共接口响应{
}
公共类ClassA实现响应{
//你的密码在这里
}
public类ClassB实现响应{
//代码在这里
}
通过这种方式,你可以实现你正在尝试的目标。在问家庭作业问题时,表现出你解决问题的最佳诚意,告诉我们你遇到了什么问题,以便我们更好地了解你的意图、你可能做错了什么以及你的目标。请浏览、和部分,了解本网站的工作原理,并帮助您改进当前和未来的问题。另外,请看一看,如果类a和类B是继承层次结构中的实体,那么所有这些都可以在没有任何条件的情况下透明地处理,但是您实际上没有发布任何相关代码,因此不可能这么说。我还想使用@Valid annotation我很少验证我认为您不能使用
@Valid
那样。另一种方法是通过编程调用验证器(假设您已经编写了验证器)。答案已更新。不,我不是在尝试发送2个不同的响应,而是尝试在post请求中根据Path VARIABLE的值接收2个不同的对象作为请求主体,这很简单。跟我一样。但恰恰相反。
@RestController
@RequestMapping("/my-custom-url")
public class MyController {
@PostMapping("/param1")
public ResponseEntity<Object> handleClassA(
@Valid @RequestBody ClassA classA,
BindingResult result) {
...
return ResponseEntity.ok("Ok");
}
@PostMapping("/param2")
public ResponseEntity<Object> handleClassB(
@Valid @RequestBody ClassB classB,
BindingResult result) {
...
return ResponseEntity.ok("Ok");
}
}