Nano Hash - криптовалюты, майнинг, программирование

Сопоставление ответов Spring Boot и Swagger text/html

У меня есть один очень простой проект 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", результат будет ожидаемым: введите здесь описание изображения

введите описание изображения здесь

Но если я попытаюсь использовать products="text/html"

Ответ не такой, как ожидалось: введите здесь описание изображения

и тело ответа;

<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-ответ, и как это сделать?



Ответы:


1

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

Вместо этого можно привязать POJO (модель) к html, используя другие средства, которые Spring предлагает из коробки: Thymleaf templates, шаблоны 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, заполните модель и верните представление «таблица». Например:
    @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";
    }
20.03.2019

2

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

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

15.03.2019
  • Да, но есть ли какие-либо сопоставления/аннотации для создания HTML. Я не могу найти аннотации в Интернете для создания HTML с моим объектом POJO. Я спрашиваю себя, возможно ли вообще, или я ищу то, чего нет? 17.03.2019
  • Я считаю, что его не существует. 18.03.2019
  • @АрмерБ. нет смысла генерировать HTML из POJO, вместо этого визуализируйте этот HTML с помощью шаблона (thymeleaf, jsp, jsf, struts и многие другие могут помочь) 20.03.2019

  • 3

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

    Я считаю, что Spring Boot использует Джексона для вывода данных, и Джексон поддерживает эти форматы:

    • JSON
    • HTML
    • УЛЫБКА
    • YAML
    • Авро
    • 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, для традиционного веб-приложения.

    20.03.2019

    4

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

    Первый имеет смысл для приложений, ориентированных на сервер Jetty. Вот объяснение — здесь. Главное в produces="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;
        }
    }
    
    25.03.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..