8
votes

Mappage des réponses texte / html Spring Boot et Swagger

J'ai un projet java spring boot + swagger très simple.

Seulement à des fins de test, j'ai créé deux classes de mappage: Names.java et NamesContainer.java

<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> 

...........

    @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;
}

Pour la réponse, j'utilise une méthode @Get:

    @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)

Si j'utilise produit = "application / json" ou produit = "application / xml" , le résultat est comme prévu: entrez la description de l'image ici

 entrez la description de l'image ici

Mais si j'essaye d'utiliser produit =" text / html "

La réponse n'est pas celle attendue: entrez la description de l'image ici

et le corps de la réponse est;

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)

La question est est-il possible de mapper mon objet existant NamesContainer.java de manière à ce que je puisse générer une réponse HTML et comment faire cela?


1 commentaires

passé du temps là-dessus, cela pourrait être utile github.com/springfox/springfox/issues/1180 < / a>


4 Réponses :


0
votes

Votre Pojo peut avoir besoin de mappages / annotations plus explicites pour produire du HTML. Je suppose que vous cherchez quelque chose comme

<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>

Je ne sais pas quelle annotation peut aider, mais c'est par là que je commencerais


3 commentaires

Oui, mais y a-t-il des mappages / annotations pour produire du HTML. Je ne trouve pas d'annotations sur Internet pour produire du HTML avec mon objet POJO. Je me demande si c'est possible ou je cherche quelque chose qui n'existe pas?


Je crois que cela n’existe pas.


@ArmerB. il n'y a aucun sens de générer du HTML à partir de POJO, à la place de rendre ce HTML en utilisant un modèle (thymeleaf, jsp, jsf, struts et bien d'autres pourraient aider)



3
votes

Il n'y a aucun moyen (aucun moyen déjà existant) de mapper les champs POJO en html avec des annotations.

En lecture seule, on peut lier des POJO (modèle) au html en utilisant d'autres moyens que Spring propose hors de la boîte: Thymleaf temlates , Modèles Freemarker et pages JSP.

Voici un exemple de l'une des solutions possibles:

  1. Créez une page HTML à l'aide du modèle html Thymleaf. Par exemple, une vue table.html :

    @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. Créez un @RequestMapping pour le type de contenu 'text / html' dans un Spring @Controller , remplissez le modèle et renvoyez la vue 'table'. Par exemple:
<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>


0 commentaires

0
votes

TLDR: Oui, c'est possible. Créez un module de format de données Jackson pour HTML.

Je pense que Spring Boot utilise Jackson pour la sortie de données, et Jackson prend en charge ces formats:

  • JSON
  • HTML
  • SOURIRE
  • YAML
  • Avro
  • CSV

et bien d'autres ( https://github.com/FasterXML/jackson ), mais là aucun format comme HTML n'est pris en charge (comment cela pourrait-il être possible?).

Le rendu HTML nécessite la création de modèles. En savoir plus sur Spring MVC https://spring.io/guides/gs/serving-web -contenu / .

Veuillez également lire sur la négociation de contenu ( https: //spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc )

Vous pouvez utiliser l'approche RESTful @ResponseBody et les convertisseurs de message HTTP, généralement pour renvoyer des formats de données tels que JSON ou XML.

(...) les vues sont parfaitement capables de générer JSON et XML si vous le souhaitez, les vues sont normalement utilisées pour générer des formats de présentation comme HTML pour une application Web traditionnelle.


0 commentaires

0
votes

J'ai trouvé plusieurs opportunités pour résoudre ce problème, mais je pense que les deux sont les meilleures:

La première est logique pour les applications orientées serveur jetty. Voici l'explication - ici . L'élément majeur dans produit = "text / html, ..., ..." est Interface MessageBodyWriter . Si vous pouvez le personnaliser, vous pouvez faire tout le lien avec lui.

La deuxième , et ma solution finale est simplement de créer un fichier .xsl pour mon. xml fichier. J'ai transformé mon fichier .xml en HTML, puis la réponse est terminée.

** Si quelqu'un veut tout faire en une seule méthode peut utiliser ceci:

@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;
    }
}

p>


0 commentaires