Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring引导中的条件JSON请求映射_Java_Spring Boot_Spring Data Jpa - Fatal编程技术网

Java Spring引导中的条件JSON请求映射

Java 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

我有一个带有URL
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");
    }

}