web-dev-qa-db-fra.com

Le printemps par défaut consomme et produit

J'écris un servlet qui utilisera un tas de retentir pour fournir des fonctionnalités.

Tout cela utilisera JSON presque exclusivement, alors je voudrais un moyen compact pour dire: sauf indication contraire, consommer et produire mediatype.application_json_value pour tout.

Je pensais avoir trouvé une belle solution sur un autre SO Question .

Cependant, comme cela a déjà souligné dans n commentaire , cette solution provoque des problèmes.

@RestController
@RequestMapping(value = "/relationship/type", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE, method = {
        RequestMethod.GET
     })
public class DRelationshipTypeResource {

    // @GetMapping("/all")
    @RequestMapping(value = "/all", method = RequestMethod.GET)
    public List<DRelationshipTypeDTO> getAll() {
        return DRelationshipTypeService.getAll();
    }

Ce contrôleur mettra également en vedette Post/Met/Supprimer plus d'autres obtient. Je les ai supprimés pour minimiser les causes possibles des erreurs.

Appeler cet itinéraire produit une erreur 415.

Pire encore, j'aimerais vraiment pouvoir utiliser

@GetMapping("/all")

au lieu de la surcharge plus verbeuse @RequestMapping pour la méthode Getallall () -, mais qui produit également la même erreur 415.

La console de débogage du serveur crache ceci lorsque la demande arrive:

2019-01-29 10:20:54.627  WARN 10712 --- [io-9999-exec-10] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type '' not supported]

2019-01-29 10:20:54.628 ERROR 10712 --- [io-9999-exec-10] o.a.c.c.C.[Tomcat].[localhost]           : Exception Processing ErrorPage[errorCode=0, location=/error]

Java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getHttpServletMapping()Ljavax/servlet/http/HttpServletMapping;
    at org.Apache.catalina.core.ApplicationHttpRequest.setRequest(ApplicationHttpRequest.Java:690) ~[Tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.Apache.catalina.core.ApplicationHttpRequest.<init>(ApplicationHttpRequest.Java:114) ~[Tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.Apache.catalina.core.ApplicationDispatcher.wrapRequest(ApplicationDispatcher.Java:917) ~[Tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.Apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.Java:358) ~[Tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.Apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.Java:312) ~[Tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.Apache.catalina.core.StandardHostValve.custom(StandardHostValve.Java:394) [Tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.Apache.catalina.core.StandardHostValve.status(StandardHostValve.Java:253) [Tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:175) [Tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:92) [Tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:74) [Tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:343) [Tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.Apache.coyote.http11.Http11Processor.service(Http11Processor.Java:408) [Tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.Apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.Java:66) [Tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.Apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.Java:834) [Tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.Java:1417) [Tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.Apache.Tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.Java:49) [Tomcat-embed-core-9.0.14.jar:9.0.14]
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1149) [na:1.8.0_181]
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:624) [na:1.8.0_181]
    at org.Apache.Tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.Java:61) [Tomcat-embed-core-9.0.14.jar:9.0.14]
    at Java.lang.Thread.run(Thread.Java:748) [na:1.8.0_181]

et retourne un statut HTTP 415 - Type de support non pris en charge au client en faisant la demande.

Pour clarifier davantage, si j'utilise une classe "muette" telle que celle-ci, tout fonctionne bien, le contenu étant correctement renvoyé comme JSON.

@RestController
@RequestMapping("relationship/type")
public class DRelationshipTypeResource {

    @GetMapping("/all")
    public List<DRelationshipTypeDTO> getAll() {
        return DRelationshipTypeService.getAll();
    }
5
Senshi

La question était avec mes demandes qui ne disposent pas explicitement d'un en-tête de type de contenu/JSON, comme indiqué par https://stackoverflow.com/a/54418436/2436002 .

Pour éclaircir une partie de la désinformation apparente sur tout cela, tout a fonctionné comme prévu maintenant, avec un code très lisible, propre et ressemblant à un ressort. Peut-être que cela peut aider les autres à la recherche d'un exemple.

@RestController
@RequestMapping(value = "relationship/type", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public class DRelationshipTypeResource {

    @GetMapping("/all")
    public List<DRelationshipTypeDTO> getAll() {
        return DRelationshipTypeService.getAll();
    }

    @GetMapping("/{query}")
    public DRelationshipTypeDTO get(@PathVariable("query") String query) {
        return DRelationshipTypeService.get(query);
    }

    @PostMapping
    public ResponseEntity<Void> create(DRelationshipTypeDTO dto) {
        String label = DRelationshipTypeService.create(dto);
        URI uri = ServletUriComponentsBuilder.fromCurrentRequest().path("/{label}").buildAndExpand(label).toUri();
        return ResponseEntity.created(uri).build();
    }

    @PutMapping("{label}")
    public ResponseEntity<Void> update(@PathVariable("label") String label, DRelationshipTypeDTO dto) {
        DRelationshipTypeService.update(label, dto);
        return ResponseEntity.noContent().build();
    }

    @DeleteMapping("{label}")
    public ResponseEntity<Void> delete(@PathVariable("label") String label) {
        DRelationshipTypeService.delete(label);
        return ResponseEntity.noContent().build();
    }

Pas encore à 100% sur la meilleure méthode pour le bâtiment URI pendant le POST/Créer, mais c'est un problème différent, ce qui fonctionne au moins bien (en-tête d'emplacement approprié pour la réponse HTTP201).

0
Senshi