SpringWebXML不考虑Java11中的XmlRootElement

SpringWebXML不考虑Java11中的XmlRootElement,java,xml,java-11,Java,Xml,Java 11,我将我的应用程序迁移到JDK11(从JDK 8),因此我将升级到springboot2.2.4.版本,并添加com.fasterxml.jackson.dataformat:jackson dataformat xml 我的型号: @XmlRootElement(name = "dataModel") public class DataModel { ... } @RequestMapping(value = "/{model}/columns", method = RequestMe

我将我的应用程序迁移到JDK11(从JDK 8),因此我将升级到
springboot
2.2.4.版本
,并添加
com.fasterxml.jackson.dataformat:jackson dataformat xml

我的型号:

@XmlRootElement(name = "dataModel")
public class DataModel {
    ...
}
@RequestMapping(value = "/{model}/columns", method = RequestMethod.GET, consumes = MediaType.ALL_VALUE, produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE })
public ResponseEntity<DataModel> getColumnsModel(@PathVariable String model) {
    LOGGER.info("getColumnsModel : model[{}]", model);
    DataModel dataModel = modelService.getColumns(model);
    return Optional.ofNullable(dataModel).map(result -> new ResponseEntity<>(result, HttpStatus.OK)).orElse(new ResponseEntity<>(HttpStatus.NO_CONTENT));
}
curl -s --header "Accept: application/xml" http://localhost:8084/api/foo/columns
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><dataModel><columns>author</columns><columns>zip</columns><columns>city</columns><columns>element</columns><columns>element2</columns><columns>date</columns><columns>title</columns></dataModel>
<DataModel><columns><columns>author</columns><columns>zip</columns><columns>city</columns><columns>element</columns><columns>element2</columns><columns>date</columns><columns>title</columns></columns></DataModel>
我的控制器:

@XmlRootElement(name = "dataModel")
public class DataModel {
    ...
}
@RequestMapping(value = "/{model}/columns", method = RequestMethod.GET, consumes = MediaType.ALL_VALUE, produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE })
public ResponseEntity<DataModel> getColumnsModel(@PathVariable String model) {
    LOGGER.info("getColumnsModel : model[{}]", model);
    DataModel dataModel = modelService.getColumns(model);
    return Optional.ofNullable(dataModel).map(result -> new ResponseEntity<>(result, HttpStatus.OK)).orElse(new ResponseEntity<>(HttpStatus.NO_CONTENT));
}
curl -s --header "Accept: application/xml" http://localhost:8084/api/foo/columns
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><dataModel><columns>author</columns><columns>zip</columns><columns>city</columns><columns>element</columns><columns>element2</columns><columns>date</columns><columns>title</columns></dataModel>
<DataModel><columns><columns>author</columns><columns>zip</columns><columns>city</columns><columns>element</columns><columns>element2</columns><columns>date</columns><columns>title</columns></columns></DataModel>
JDK8:

@XmlRootElement(name = "dataModel")
public class DataModel {
    ...
}
@RequestMapping(value = "/{model}/columns", method = RequestMethod.GET, consumes = MediaType.ALL_VALUE, produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE })
public ResponseEntity<DataModel> getColumnsModel(@PathVariable String model) {
    LOGGER.info("getColumnsModel : model[{}]", model);
    DataModel dataModel = modelService.getColumns(model);
    return Optional.ofNullable(dataModel).map(result -> new ResponseEntity<>(result, HttpStatus.OK)).orElse(new ResponseEntity<>(HttpStatus.NO_CONTENT));
}
curl -s --header "Accept: application/xml" http://localhost:8084/api/foo/columns
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><dataModel><columns>author</columns><columns>zip</columns><columns>city</columns><columns>element</columns><columns>element2</columns><columns>date</columns><columns>title</columns></dataModel>
<DataModel><columns><columns>author</columns><columns>zip</columns><columns>city</columns><columns>element</columns><columns>element2</columns><columns>date</columns><columns>title</columns></columns></DataModel>
authorzipcityelementlement2datetitle
JDK11:

@XmlRootElement(name = "dataModel")
public class DataModel {
    ...
}
@RequestMapping(value = "/{model}/columns", method = RequestMethod.GET, consumes = MediaType.ALL_VALUE, produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE })
public ResponseEntity<DataModel> getColumnsModel(@PathVariable String model) {
    LOGGER.info("getColumnsModel : model[{}]", model);
    DataModel dataModel = modelService.getColumns(model);
    return Optional.ofNullable(dataModel).map(result -> new ResponseEntity<>(result, HttpStatus.OK)).orElse(new ResponseEntity<>(HttpStatus.NO_CONTENT));
}
curl -s --header "Accept: application/xml" http://localhost:8084/api/foo/columns
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><dataModel><columns>author</columns><columns>zip</columns><columns>city</columns><columns>element</columns><columns>element2</columns><columns>date</columns><columns>title</columns></dataModel>
<DataModel><columns><columns>author</columns><columns>zip</columns><columns>city</columns><columns>element</columns><columns>element2</columns><columns>date</columns><columns>title</columns></columns></DataModel>
authorzipcityelementlement2datetitle
新结果是strang:

@XmlRootElement(name = "dataModel")
public class DataModel {
    ...
}
@RequestMapping(value = "/{model}/columns", method = RequestMethod.GET, consumes = MediaType.ALL_VALUE, produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE })
public ResponseEntity<DataModel> getColumnsModel(@PathVariable String model) {
    LOGGER.info("getColumnsModel : model[{}]", model);
    DataModel dataModel = modelService.getColumns(model);
    return Optional.ofNullable(dataModel).map(result -> new ResponseEntity<>(result, HttpStatus.OK)).orElse(new ResponseEntity<>(HttpStatus.NO_CONTENT));
}
curl -s --header "Accept: application/xml" http://localhost:8084/api/foo/columns
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><dataModel><columns>author</columns><columns>zip</columns><columns>city</columns><columns>element</columns><columns>element2</columns><columns>date</columns><columns>title</columns></dataModel>
<DataModel><columns><columns>author</columns><columns>zip</columns><columns>city</columns><columns>element</columns><columns>element2</columns><columns>date</columns><columns>title</columns></columns></DataModel>
=>

作者…
=>
作者…

我尝试添加此依赖项,但未解决:

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>

    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.0.1</version>
    </dependency>

    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.2</version>
    </dependency>

javax.xml.bind
jaxb api
2.3.1
com.sun.xml.bind
jaxb内核
2.3.0.1
com.sun.xml.bind
jaxb impl
2.3.2
删除此项:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

com.fasterxml.jackson.dataformat
jackson数据格式xml

不,不是。JDK11没有包含JAXB,现在它使用自己的XML编组而不是JAXB。在依赖项中包含JAXB,使其再次工作。与其盲目升级JDK版本,不如先阅读发行版中发生的发行说明/更改!我没有错误(在我的日志中),但我的xml结果是错误的
作者…
@M.Deinum,
jaxb api
jaxb核心
jaxb impl
都已在我的项目中准备就绪。此外,您应该删除jackson xml依赖项,因为现在将使用它而不是jaxb。