🔗 Enable JSON conversion in MOXy to avoid 415 Unsupported Media Type
If you follow the “Getting Started” tutorial for Jersey (an API for writing REST apps in Java), you’ll get a nice working “Hello World” example called “simple-service”. However, if you try to extend it to use JSON using MOXy’s advertised auto-coversion of JSON into Java objects, you’ll get a “415 Unsupported Media Type” HTTP response if you don’t do it right.
Things that can cause 415 Unsupported Media Type:
Not having MOXy enabled in your pom.xml
Make sure this is present and uncommented in your pom.xml file:
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-moxy</artifactId> </dependency>
Not using @Consumes and @Produces annotations
Make sure they are set in your method:
@POST @Consumes("application/json") @Produces("application/json") public string postIt(MyObject obj) {
Not sending Content-Type headers
Here’s an incantation of curl that does the right thing for testing a POST:
curl -v -H "Content-Type: application/json" -X POST -d '{"name":"hisham"}' http://localhost:8080/myapp/myresource
Not initalizing the JSON feature in MOXy
This is the default initalization given in the “simple-service” minimal example:
public static HttpServer startServer() { // create a resource config that scans for JAX-RS resources and providers // in com.example package final ResourceConfig rc = new ResourceConfig().packages("com.example"); // create and start a new instance of grizzly http server // exposing the Jersey application at BASE_URI return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc); }
and this is how you should extend it:
public static HttpServer startServer() { final MoxyJsonConfig moxyJsonConfig = new MoxyJsonConfig(); final ContextResolverjsonConfigResolver = moxyJsonConfig.resolver(); // create a resource config that scans for JAX-RS resources and providers in given package final ResourceConfig rc = new ResourceConfig().packages("com.example") .register(MoxyJsonFeature.class) .register(jsonConfigResolver); // create and start a new instance of grizzly http server // exposing the Jersey application at BASE_URI return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc); }
Once all those are fixed...
Now you can add a method to MyResource such as:
@POST @Consumes("application/json") @Produces("application/json") public MyObject postIt(MyObject obj) { obj.name += " world"; return obj; }
given that you have a class like
public class MyObject { public String name; }
and the conversion to-from JSON will work automagically:
curl -v -H "Content-Type: application/json" -X POST -d '{"name":"hisham"}' http://localhost:8080/myapp/myresource > POST /myapp/myresource HTTP/1.1 > Host: localhost:40409 > User-Agent: curl/7.42.1 > Accept: */* > Content-Type: application/json > Content-Length: 17 > < HTTP/1.1 200 OK < Content-Type: application/json < Date: Mon, 14 Dec 2015 18:23:46 GMT < Content-Length: 23 < {"name":"hisham world"}
Follow
🐘 Mastodon ▪ RSS (English), RSS (português), RSS (todos / all)
Last 10 entries
- A Special Hand
- How to change the nmtui background color
- Receita de Best Pancakes
- That time I almost added Tetris to htop
- Receita de Orange Chicken
- Receita de frango empanado no panko
- Receita de cebola caramelizada
- Receita rápida de crepe
- Finally upgraded FlatPress
- Sobre o boom das commodities