我正在使用spring-data-rest,我有一个像这样的MongoRepository:
@RepositoryRestResource
interface MyEntityRepository extends MongoRepository<MyEntity, String> {
}
Run Code Online (Sandbox Code Playgroud)
我想允许GET方法,但禁用PUT,POST,PATCH和DELETE(只读Web服务).
@RepositoryRestResource
interface MyEntityRepository extends MongoRepository<MyEntity, String> {
@Override
@RestResource(exported = false)
public MyEntity save(MyEntity s);
@Override
@RestResource(exported = false)
public void delete(String id);
@Override
@RestResource(exported = false)
public void delete(MyEntity t);
}
Run Code Online (Sandbox Code Playgroud)
它似乎不起作用,因为我仍然可以执行PUT,POST,PATCH和DELETE请求.
我有一个客户端向服务器发出请求,这可能需要一些时间来响应.
当服务器想要回复时,它抛出以下异常:
连接断了.它可能被客户关闭了.
位于org.eclipse.jetty.http.AbstractGenerator.blockForOutput(AbstractGenerator.java:512)的org.eclipse.jetty.io.nio.SelectChannelEndPoint.blockWritable(SelectChannelEndPoint.java:435)中的org.eclipse.jetty.io.EofException org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:159)位于org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:101)的sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder. java:221)sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:282)at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)at sun.nio.cs.StreamEncoder.write(StreamEncoder) .java:135)at java.io.OutputStreamWriter.write(OutputStreamWriter.java:220)at java.io.Writer.write(Writer.java:157)at org.restlet.representation.StringRepresentation.write(StringRepresentation.java: 237)org.restlet.representation.CharacterRepresentation.write(CharacterRepresentation.java:76)位于org.restlet.engine.adapter.ServerCall.se的org.restlet.engine.adapter.ServerCall.writeResponseBody(ServerCall.java:509)ndResponse(ServerCall.java:453)org.restlet.ext.jetty.internal.JettyCall.sendResponse(JettyCall.java:312)org.restlet.engine.adapter.ServerAdapter.commit(ServerAdapter.java:196)org位于org.eclipse.jetty.server.AbstractHttpConnection.handleRequest的org.restlet.ext.jetty.JettyServerHelper $ WrappedServer.handle(JettyServerHelper.java:170)的.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:153) (AbstractHttpConnection.java:452)org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:894)org.eclipse.jetty.server.AbstractHttpConnection $ RequestHandler.content(AbstractHttpConnection.java:948)at org. eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:943)org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection. java:77)在org.eclipse.jetty.io.Sele上的org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:622)ctChannelEndPoint $ 1.run(SelectChannelEndPoint.java:46)org.eclipse.jetty.util.thread.QuereadThreadPool.runJob(QueuedThreadPool.java:603)org.eclipse.jetty.util.thread.QueuedThreadPool $ 3.run(QueuedThreadPool. java:538)at java.lang.Thread.run(Thread.java:722)
当发生这种情况时,客户端会无限期挂起.
这是一个重现问题的代码示例:
服务器端:
public static void main(String[] args) throws Exception {
Context context = new Context();
Server server = new Server(context, Protocol.HTTP, 8182, DummyServerResource.class);
server.start();
}
public class DummyServerResource extends ServerResource {
@Get
public String retrieve() throws InterruptedException {
Thread.sleep(1000 * 20);
return "Dummy";
}
}
Run Code Online (Sandbox Code Playgroud)
客户端:
public static void main(String[] args) throws …Run Code Online (Sandbox Code Playgroud)