Grizzly REST - POST总是404

时间:2016-09-05 08:33:49

标签: java rest jersey grizzly

在我的端点中,我有一些使用@GET的方法和一些使用@POST的方法。 @GET工作正常,但@POST总是返回404

以下是端点界面的一部分:

public interface TestEndpoint {

    @GET
    @Path("/ping")
    Response ping();

    @POST
    @Path("/weather/{iata}/{pointType}")
    Response updateWeather(@PathParam("iata") String iataCode,
                           @PathParam("pointType") String pointType,
                           String datapointJson);

    @POST
    @Path("/airport/{iata}/{lat}/{long}")
    Response addAirport(@PathParam("iata") String iata,
                        @PathParam("lat") String latString,
                        @PathParam("long") String longString);

    @GET
    @Path("/exit")
    Response exit();
}

这是服务器初始化部分:

public class TestServer {

    private static final String BASE_URL = "http://localhost:9090/";

    public static void main(String[] args) {
        try {
            final ResourceConfig resourceConfig = new ResourceConfig();
            resourceConfig.register(TestEndpointImpl.class);

            HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URL), resourceConfig, false);
            Runtime.getRuntime().addShutdownHook(new Thread(() -> {
                server.shutdownNow();
            }));

            HttpServerProbe probe = new HttpServerProbe.Adapter() {
                public void onRequestReceiveEvent(HttpServerFilter filter, Connection connection, Request request) {
                    System.out.println(request.getRequestURI());
                }
            };
            server.getServerConfiguration().getMonitoringConfig().getWebServerConfig().addProbes(probe);

            server.start();
            Thread.currentThread().join();
            server.shutdown();
        } catch (IOException | InterruptedException ex) {
            Logger.getLogger(TestServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

其中,TestEndpointImplTestEndpoint(顾名思义)的实现,带有类级别注释@Path("/collect")

当我执行GET请求时,它工作正常。但是POST是有问题的。不会调用相应的方法。

作为旁注,probe按预期打印GET和POST请求,因此我确信请求到达服务器并且路径正常。

有什么建议吗?

编辑:实施中的一些片段:

@Path("/collect")
public class TestEndpointImpl implements TestEndpoint {

    ...

    @Override
    public Response updateWeather(@PathParam("iata") String iataCode, @PathParam("pointType") String pointType,
            String datapointJson) {
        System.out.println("TRACE: " + datapointJson);
        // do something and return a Response
    }

    ...

}

已注册的探针会打印/collect/weather/BOS/wind,但不会调用updateWeather

2 个答案:

答案 0 :(得分:2)

简短回答

@POST@Path注释复制到方法实现中。它会起作用。

答案很长

关于JAX-RS 2.0规范的注释继承的部分(Jersey是参考实现的规范)非常清楚。请参阅以下引文:

  

3.6注释继承

     

JAX-RS注释可用于超类或实现接口的方法和方法参数。这样的注释由相应的子类或实现类方法继承,前提是该方法及其参数没有自己的任何JAX-RS注释。超类上的注释优先于已实现接口上的注释。多个已实现接口中定义的冲突注释的优先级是特定于实现的。请注意,不支持继承类或接口注释。

     

如果子类或实现方法具有任何JAX-RS注释,则忽略超类或接口方法上的所有注释。 E.g:

     
public interface ReadOnlyAtomFeed {

    @GET 
    @Produces("application/atom+xml")
    Feed getFeed();
}
     
@Path("feed")
public class ActivityLog implements ReadOnlyAtomFeed {

    public Feed getFeed() {...}
}
     

在上文中,ActivityLog.getFeed继承了界面中的@GET@Produces注释。相反地​​:

     
@Path("feed")
public class ActivityLog implements ReadOnlyAtomFeed {

    @Produces("application/atom+xml")
    public Feed getFeed() {...}
}
     

在上文中,@GET上的ReadOnlyAtomFeed.getFeed注释不会被ActivityLog.getFeed继承,并且它需要自己的请求方法指示符,因为它重新定义了@Produces注释。 / p>      

为了与其他Java EE规范保持一致,建议始终重复注释,而不是依赖注释继承。

答案 1 :(得分:0)

如果网址格式不正确,也会发生这种情况;例如,您可能在没有正确路径参数的情况下发送了请求。