Spring Boot和Swagger文本/ html响应映射

时间:2019-03-15 17:07:13

标签: java html spring-boot swagger swagger-ui

我有一个非常简单的java spring boot + swagger项目。

仅出于测试目的,我创建了两个映射类:Names.java和NamesContainer.java

public class Names {

@XmlAttribute(name="ref")
@ApiModelProperty(notes = "The auto-generated version of the product...")
private String key;

@XmlValue
@ApiModelProperty(notes = "The auto-generated version of the product...")
private String name;....-> rest of the class(Default constuctor and getters and setters)

...........

    @XmlRootElement(name="root")
public class NamesContainer {

    @XmlElement(name="listNames")
    @ApiModelProperty(notes = "The auto-generated version of the product")
    private List<Names> listNames;....-> rest of the class(Default constuctor and getters and setters)

对于响应,我使用一种@Get方法:

    @RequestMapping(method = RequestMethod.GET, value = "/api/javainuse")
    @ApiOperation(value = "Get a scheduled process by id.",notes = "This is note ;)",response = NamesContainer.class,code = HttpURLConnection.HTTP_OK, produces="text/html")
    @ApiResponses(value = {@ApiResponse(code = HttpURLConnection.HTTP_OK, message = "set in case of success. Returns the requested scheduled process",  response = NamesContainer.class)})

    public NamesContainer sayHello() {

        Map<String, String> mapNames = new HashMap<String, String>();
        mapNames.put("Name1", "Docnho");
        mapNames.put("Name2", "Silvia");
        mapNames.put("Name3", "Pepa");
        mapNames.put("Name4", "Mima");
        mapNames.put("Name5", "Mohamed");

        List<Names> listNames = new ArrayList<Names>();

    for(Map.Entry<String, String> entryName : mapNames.entrySet())
    {
        listNames.add(new Names(entryName.getKey(), entryName.getValue()));
    }

    NamesContainer container = new NamesContainer(listNames);


    return container;
}

如果我使用 produces =“ application / json” produces =“ application / xml” ,结果将与预期的一样: enter image description here

enter image description here

但是,如果我尝试使用 produces =“ text / html”

响应不符合预期: enter image description here

响应主体是;

<html><body><h1>Whitelabel Error Page</h1><p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p><div id='created'>Fri Mar 15 18:43:55 EET 2019</div><div>There was an unexpected error (type=Not Acceptable, status=406).</div><div>Could not find acceptable representation</div></body></html> 

问题是是否可以通过我可以生成HTML响应的方式映射现有对象NamesContainer.java以及如何做到这一点?

4 个答案:

答案 0 :(得分:2)

无法(没有现有方法)将POJO字段映射到带有注释的html。

Instread使用者可以使用Spring开箱即用地提议的其他方式将POJO(模型)绑定到html:Thymleaf temlatesFreemarker templates和JSP页面。

以下是可能的解决方案之一的示例:

  1. 使用html Thymleaf模板创建HTML页面。例如table.html视图:

<body>
    <table>
    <tr>
        <th>Key</th>
        <th>Name</th>
    </tr>
    <tr th:each="mapEnty: ${mapNames}">
        <td th:text="${mapEnty.key}" />
        <td th:text="${mapEnty.value}" />
    </tr>
    </table>
</body>

  1. 在Spring @Controller中为'text / html'内容类型创建一个@RequestMapping,填写模型并返回'table'视图。例如:
    @GetMapping(value = "/api/javainuse", produces = MediaType.TEXT_HTML_VALUE)
    public String table(Model model) {
        Map<String, String> mapNames = new HashMap<String, String>();
        ...
        model.addAttribute("mapNames", mapNames);
        return "table";
    }

答案 1 :(得分:0)

TLDR:是的,有可能。为HTML创建Jackson数据格式模块。

我相信Spring Boot正在使用Jackson进行数据输出,并且Jackson支持该格式:

  • JSON
  • HTML
  • 微笑
  • YAML
  • Avro
  • CSV

以及更多(https://github.com/FasterXML/jackson),但是不支持HTML之类的格式(这怎么可能?)。

HTML渲染需要模板。了解有关Spring MVC https://spring.io/guides/gs/serving-web-content/的信息。

也请阅读有关内容协商(https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc

  

您可以使用RESTful @ResponseBody方法和HTTP消息转换器,通常返回JSON或XML之类的数据格式。

     

(...)视图完全能够生成JSON和XML(如果您愿意的话),这些视图通常用于为传统的Web应用程序生成表示形式,例如HTML。

答案 2 :(得分:0)

我发现了解决此问题的几种机会,但我认为这两个最好:

第一个对于面向码头服务器的应用程序很有意义。这是解释-here produces =“ text / html,...,...” 中最主要的是MessageBodyWriter界面。如果您可以对其进行自定义,则可以对其进行永远的思考。

第二个,最后的解决方案是为.xml文件创建 .xsl 文件。我将.xml文件转换为HTML,然后完成了响应。

**如果某人想用一种方法做所有事情,可以使用此方法:

@RequestMapping(method = RequestMethod.GET, value = "/api/javainuse")
@ApiOperation(value = "Get a scheduled process by id.",notes = "This is note ;)",response = NamesContainer.class,code = HttpURLConnection.HTTP_OK, produces="text/html" /*add produces->xml*/)
@ApiResponses(value = {@ApiResponse(code = HttpURLConnection.HTTP_OK, message = "set in case of success. Returns the requested scheduled process",  response = NamesContainer.class)})

public Response sayHello(HttpServletResponse response) {
    switch (request.getHeader("accept"))
    {

        case MediaType.APPLICATION_XML:

            response = Response.ok().entity(/*yourEntity here (for me it was NamesContainer)*/).type(MediaType.APPLICATION_XML).build();
            break;

        case MediaType.TEXT_HTML:

            response = Response.ok().entity(/*Transform xml to HTML with xsl and return it here as String*/).type(MediaType.TEXT_PLAIN).build();
            break;
    }
}

答案 3 :(得分:-1)

您的Pojo可能需要更显式的映射/注释才能生成HTML。我认为您正在寻找

之类的东西
<table>
  <tr>
    <th>Name1</th>
    <th>Name2</th>
    <th>Name3</th>
    <th>Name4</th>
  </tr>
  <tr>
    <td>Peppa</td>
    <td>Mima</td>
    <td>Mohamed</td>
    <td>Docnho</td>
  </tr>
</table>

我不确定哪个注释可以提供帮助,但这就是我要开始的地方