如何在Spring Boot应用程序中将参数传递给自定义JSON反序列化器

时间:2019-06-17 22:45:37

标签: java json spring spring-boot

我想在Spring Boot Rest Controller中使用自己的解串器。要完成其工作,它需要一些自定义配置-作为构造函数参数提供给它。如何在rest控制器中传递这样的参数?

这里是例子。

DTO(带有一些龙目岛注释):

@Getter
@Setter
@RequiredArgsConstructor
@AllArgsConstructor
@JsonDeserialize(using = Deserializer.class)
public class DTO {
    private int a;
    private int b;
}

反序列化器:

public class Deserializer extends JsonDeserializer<DTO> {
    //custom config
    int val;

    public Deserializer(int value) {
        val = value;
    }

    @Override
    public DTO deserialize(JsonParser p, DeserializationContext ctxt) throws IOException{

        JsonNode node = p.readValueAsTree();
        int a = node.has("a") ? node.get("a").asInt() : -1;
        int b = node.has("b") ? node.get("b").asInt() : -1;
        //custom config usage
        return new DTO(a + val, b + val);
    }
}

控制器:


@RestController
@RequestMapping
public class Controller {
   //how to pass `val` into deserializer of DTO object?
    @PostMapping("/foo")
    DTO foo(@RequestBody DTO dto) {
        return dto;
    }
}

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以创建一个自定义ObjectMapper并将自定义序列化器添加到其中,并同时从application.properties中加载自定义值。

我认为这应该行得通,是从我的头上写出来的。

this.slides.map((slide, index) => {
    return (
     <Carousel.Item>
       <Row className="item-container carousel-item d-flex flex-xl-column flex-wrap">
          {
            slide.map(category => { // slide is not defined
               return (                                            
                 <Col className="px-2 category__card" xl={category.xl} md={category.md}>
                   <Card className="p-2" style={category.style}>
                       <Card.Body>
                         <Card.Title className="text-white font-weight-normal text-uppercase ">
                           <h4>
                              category.title}
                           </h4>
                         </Card.Title>
                         <Button variant="light rounded-0" >View Products</Button>    
                      </Card.Body>
                      <div className="card-image-cont">
                         <Card.Img  src={category.img} className="card-image"/>
                      </div> 
                   </Card>  
                 </Col>
              );
            })
          }
       </Row>
    </Carousel.Item> 
)})