即使错误的XML根元素,杰克逊的解组工作也会成功

时间:2019-04-26 15:37:15

标签: java jackson spring-web jackson-dataformat-xml

使用Spring Boot(2.1.4)和Jackson(2.9.8),我正在使用@RestController和@RequestBody编写一个使用和生成XML的API。

使用XML可以,但是效果有点好:当根元素与我的Java对象(用@JacksonXmlRootElement localName注释)不匹配时,它仍然可以取消编组对象。

其余控制器看起来像这样:

@RestController
@RequestMapping(value = "api", produces = MediaType.APPLICATION_XML_VALUE, consumes = MediaType.APPLICATION_XML_VALUE)
public class PutawayApiController extends BaseController {

    private final ModelSampleService sampleService;

    @Autowired
    public PutawayApiController(ModelSampleService sampleService) {
        this.sampleService = sampleService;
    }

    @PostMapping(value = "/putaway_close")
    public PutawayCloseResponse putawayClose(@RequestBody PutawayCloseRequest request) {
        return sampleService.putawayCloseResponse();
    }

}

请求对象为:

@Data
@EqualsAndHashCode(callSuper = false)
@JacksonXmlRootElement(localName = "putawayCloseRequest")
public class PutawayCloseRequest extends BaseRequest {

    private String shipmentRef;

}

它继承自:

@Data
public abstract class BaseRequest {

    private String userId;

}

在Postman中执行以下调用时,它将触发我的调试点,如下图所示: Unmarshalling triggered although incorrect root element name

即使根元素显然不是我配置的内容,为什么也要取消编组?根元素不匹配时,是否有办法拒绝解组?

谢谢。

1 个答案:

答案 0 :(得分:0)

因为文档,即@JacksonXmlRootElement的Javadoc说:

  

可用于定义用于根级对象序列化时的根元素名称的注释,该字符通常使用类型(类)的名称。

在反序列化时,它从不声称会使用它进行验证。