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();
}
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).