Spring Boot и Swagger отображение текста / HTML-ответа - PullRequest
7 голосов
/ 15 марта 2019

У меня есть один очень простой проект 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;
}

Если я использую производит = "приложение / json" или производит = "приложение / xml" , результат будет таким, как ожидалось: enter image description here

enter image description here

Но если я попытаюсь использовать производит = "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> 

Вопрос в том, можно ли отобразить мой существующий объект NamesContainer.java таким образом, чтобы я мог генерировать HTML-ответ и как это сделать?

Ответы [ 4 ]

2 голосов
/ 20 марта 2019

Нет способа (нет уже существующего способа) отобразить поля POJO в html с аннотациями.

Instread можно связать POJO (модель) с html, используя другие средства, которые Spring предлагает из коробки: Шаблоны Thymleaf , Шаблоны Freemarker и страницы JSP.

Вот пример одного из возможных решений:

  1. Создание HTML-страницы с использованием HTML-шаблона Thymleaf. Например, 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. Создайте @RequestMapping для типа контента text / html в Spring @Controller, заполните Model и верните представление 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";
    }
0 голосов
/ 25 марта 2019

Я нашел несколько возможностей для решения этой проблемы, но я думаю, что эти два являются лучшими:

Первый имеет смысл для приложений, ориентированных на серверы Jetty.Вот объяснение - здесь .Главное в производит = "text / html, ..., ..." - это MessageBodyWriter интерфейс.Если вы можете настроить его, вы можете сделать с ним что угодно.

Второй , и мое окончательное решение - просто создать файл .xsl для моего файла .xml.Я преобразовал свой 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;
    }
}
0 голосов
/ 20 марта 2019

TLDR: Да, это возможно.Создайте модуль формата данных Jackson для HTML.

Я считаю, что 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, если хотите, представления обычно используются для генерации форматов представления, таких как HTML, для традиционного веб-приложения.

0 голосов
/ 15 марта 2019

Вашему 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>

Я не уверен, какая аннотация может помочь, но именно с этого я бы начал

...