20

I have a very simple endpoint using Jersey. My URL is static, it doesn't require any request parameters. It looks like this:

@GET
@Path("/mydata")
@Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)  
public String getData()  {
  return "{'name': 'value'}";
}

However, whenever I request this URL, I always receive a HTTP Status code of 405 - Method Not Allowed.

The weird thing is, that if I change the @Path annotation and define a path variable e.g. @Path("/chart/{blah}") it works fine.

Does anyone have an idea why I have to define a path variable to get this to work? I don't need a path variable and it seems silly to add one just to get a 200 response.

bluish
  • 26,356
  • 27
  • 122
  • 180
seedhead
  • 3,655
  • 4
  • 32
  • 38

5 Answers5

12

Thanks for the suggestions. It ended up being me stupidly entering an incorrect url-pattern for my jersey SpringServlet. It was / instead of /*

<servlet>
   <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
</servlet>

<url-pattern>/*</url-pattern>

<servlet-mapping>
   <servlet-name>Chart Service</servlet-name>
   <url-pattern>/*</url-pattern>
</servlet-mapping>
higuaro
  • 15,730
  • 4
  • 36
  • 43
seedhead
  • 3,655
  • 4
  • 32
  • 38
6

Annotate the class instead of the method:

@Path("/mydata")
public class MyClass(){

@GET
@Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)  
public String getData()  {
  return "{'name': 'value'}";
}

}

I don't know why but it also gives me problems the other way

Eugenio Cuevas
  • 10,858
  • 3
  • 29
  • 51
4

I think it's probably because you specified

@Produces(MediaType.APPLICATION_JSON).

1) Maybe you should try running the following in a terminal

curl -i -X GET -H 'Accept:application/json' http://localhost:8080/mydata

2) Or try change to

@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_HTML})
tanyehzheng
  • 2,201
  • 1
  • 20
  • 33
4

another possible source of such problem: be very attentive with all the params and annotations. I was having such problem, when I was calling a method with POST, while it was annotated with @PUT

62mkv
  • 1,444
  • 1
  • 16
  • 28
-7

I was suffering the same problem; http://localhost:8080/mypath/myendpoint wasn't working.

Try adding "/rest" to the path, as in http://localhost:8080/rest/mypath/myendpoint

Redboots
  • 115
  • 3
  • 11