🔗 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 ContextResolver jsonConfigResolver = 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
- Aniversário do Hisham 2025
- The aesthetics of color palettes
- Western civilization
- Why I no longer say "conservative" when I mean "cautious"
- Sorting "git branch" with most recent branches last
- Frustrating Software
- What every programmer should know about what every programmer should know
- A degradação da web em tempos de IA não é acidental
- There are two very different things called "package managers"
- Last day at Kong