7

我尝试使用 Springboot 2.2.4.RELEASE + JDK11 和 java 8 编译使用 XML 和 JSON 创建 Web API。

我的模型:

@XmlRootElement
public class DataModel {

    private List<String> columns;

    private List<Row> rows;

    public List<String> getColumns() {
        return columns;
    }

    public void setColumns(List<String> columns) {
        this.columns = columns;
    }

    public List<Row> getRows() {
        return rows;
    }

    public void setRows(List<Row> rows) {
        this.rows = rows;
    }

}

我的控制器:

@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 -v --header "Accept: application/xml" http://localhost:8084/api/foo/columns

在我的电脑(Windows 10)上,结果还可以。

* TCP_NODELAY set
* Connected to localhost (::1) port 8084 (#0)
> GET /noraui/api/hello/columns HTTP/1.1
> Host: localhost:8084
> User-Agent: curl/7.67.0
> Accept: application/xml
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< Content-Type: application/xml
< Transfer-Encoding: chunked
< Date: Tue, 03 Mar 2020 08:38:20 GMT
<
{ [254 bytes data]
* Connection #0 to host localhost left intact

我在 Unix 平台 (travis-ci) 上的错误:

Resolved [org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class com.github.noraui.data.rest.DataModel] with preset Content-Type 'null']

< HTTP/1.1 500 
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< Content-Length: 0
< Date: Tue, 03 Mar 2020 08:41:28 GMT
< Connection: close
< 
* Closing connection 0
4

7 回答 7

3

我通过添加以下依赖项解决了这个问题:

<dependency>
  <groupId>com.fasterxml.jackson.dataformat</groupId>
  <artifactId>jackson-dataformat-xml</artifactId>
  <version>2.12.3</version>
</dependency>
于 2021-06-01T15:33:25.503 回答
1

我有一个类似的错误,但使用 JSON。

我的问题发生了,因为我尝试转换为 JSON 的 POJO 必须具有相同名称的属性

@JsonProperty("my_property")
[...]
@JsonProperty("my_property")  // duplicated property name in the same POJO.

修复重复后,对象可以正确转换。

于 2020-08-03T01:33:32.003 回答
1

就我而言,我正在研究一个现有的 api,它正在生成 PDF,并且必须更改对 JSON 的响应。我忘了produces = "application/pdf"@GetMapping注释中删除。

于 2022-01-08T16:40:46.517 回答
0

您可以使用 Postman 进行测试吗?我刚刚用 Postman 做了一个测试,效果很好。但是,请检查两次请求的标头并确保它是正确的。

PS:我在 github.com/NoraUi/noraui-datas-webservices 检查了项目,并使用提到的依赖项(jaxb-runtime 和 xerces)进行了测试,这些依赖项根本不需要。@XmlRootElement 注释应该足够了。我刚刚向我的 GitHub 帐户提交了一个个人项目。这是一个更干净的例子。请检查一下:https ://github.com/DavidGuimaraes/spring-security-basic

于 2020-04-02T22:46:59.397 回答
0

在我自己的特殊情况下,我在尝试为 Spring Boot 控制器类运行集成测试时遇到此错误。我怀疑这可能会发生,因为由于模拟的 Spring 上下文,运行时库/类加载出现了问题 - 但我无法理解究竟缺少什么......我仍然不能,我希望有人能更清楚地了解这个问题。我尝试自己转换为 JSON 并在 ResponseEntity 的主体内返回一个字符串,这很有效,因为我必须将 Jackson 的 ObjectMapper 指定为 SpringBootTest(classes = {...}) 中的类之一。

所以这有效:

ResponseMessage m = new ResponseMessage("haha");
ResponseEntity r = ResponseEntity.status(HttpStatus.OK).body(objectMapper.writeValueAsString(m));

但这首先不是(这是我的问题):

ResponseMessage m = new ResponseMessage("haha");
ResponseEntity r = ResponseEntity.status(HttpStatus.OK).body(m); // exception happens further while being processed by Spring

例外:

mo.s.w.s.m.s.DefaultHandlerExceptionResolver.logException - Resolved [org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class gr.unisystems.ethemisid.view.model.response.ResponseMessage] with preset Content-Type 'null'] 
mo.s.t.w.s.TestDispatcherServlet.logResult - Completed 500 INTERNAL_SERVER_ERROR
于 2021-02-20T17:37:17.260 回答
0

在模型类中添加“toString()”方法对我有用。(我为此使用了@Data Lombok 注释)

于 2022-01-02T19:54:18.093 回答
0

当您尝试从 RestController 方法返回一个实体而不是您可能创建的实体的 DTO 时,有时也会发生此错误,例如,您的实际实体的 XMLRootElement。

要么不返回任何内容 ( ),要么返回从' 方法正确注释void的类的实例。RestController

我知道 OP 的这个例外是由于他的pom文件中缺乏适当的依赖性而引起的。尽管如此,上面提到的技巧是解决这个问题的方法之一。或许,只有我有这个粗心的问题。:'D

该方法的最终代码可能如下所示:

    @ResponseBody
    @ResponseStatus(HttpStatus.CREATED)
    @PostMapping(value = "/xml",
            consumes = MediaType.APPLICATION_XML_VALUE,
            produces = MediaType.APPLICATION_XML_VALUE)
    public void addPaymentXml(@RequestBody String paymentXml)
            throws IOException, SAXException {
        paymentService.createPaymentXml(paymentXml);
    }
于 2021-05-11T08:17:00.223 回答