在我的端点中,我有一些使用@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);
}
}
}
其中,TestEndpointImpl
是TestEndpoint
(顾名思义)的实现,带有类级别注释@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
。
答案 0 :(得分:2)
关于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)
如果网址格式不正确,也会发生这种情况;例如,您可能在没有正确路径参数的情况下发送了请求。