我在Spark框架中注意到了一些东西.它与使用映射路由的尾部斜杠不匹配.所以它认为/ api/test和/ api/test /是不同的URI.
如果有一种方法可以将它们一起通配,那就好了,但似乎没有.我错过了什么吗?
我想要这条路线:
Spark.get("/api/test", (req, res) -> {
return "TEST OK";
});
Run Code Online (Sandbox Code Playgroud)
匹配/ api/test OR/api/test /.就目前而言,它只匹配/ api/test,如果我将其切换为:
Spark.get("/api/test/", (req, res) -> {
return "TEST OK";
});
Run Code Online (Sandbox Code Playgroud)
它只匹配 /api/test/
我正在构建一个带有嵌入式Jetty和Handlebars模板引擎的Spark框架的Java应用程序.但是当我得到500内部错误时,控制台没有说什么.我已经在我的pom.xml中添加了依赖项:http://sparkjava.com/documentation.html#add-a-logger 但不会打印所有异常/错误(如错误500)
在这里我的pom.xml dependecies
<dependencies>
<!-- FRAMEWORK: Spark -->
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.5</version>
</dependency>
<!-- TEMPLATES: Handlebars -->
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-template-handlebars</artifactId>
<version>2.3</version>
</dependency>
<!-- DB-MAPPING: sql2o -->
<dependency>
<groupId>org.sql2o</groupId>
<artifactId>sql2o</artifactId>
<version>1.5.4</version>
</dependency>
<!-- DRIVERS: sqlite-->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.8.11.2</version>
</dependency>
<!-- LOGGER: slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
我怎样才能启用所有火花记录?
我想使用前置过滤器来添加尾部斜杠以及前置过滤器来处理某些端点上的身份验证.
这是我的路由代码:
// Add filter to all requests which adds a trailing slash if it is missing //
before("*", Filters.addTrailingSlashes);
path("/api", () -> {
// Authentication Intercept //
before("/*", AuthenticationIntercept.authenticationIntercept);
// Sampling Endpoints //
get(Path.Web.SAMPLES_FETCH_LATEST, SamplingController.fetchLatestSamples, new JsonTransformer());
get(Path.Web.SAMPLES_FETCH_FOR_DEVICE, SamplingController.getLatestSamplesForDevice, new JsonTransformer());
});
Run Code Online (Sandbox Code Playgroud)
然后我点击以下端点:
本地主机:4567/API /样品/ 10
会发生什么是首先调用addTrailingSlashes.然后调用身份验证过滤器,然后再次调用addTrailingSlashes,localhost:4567/api/samples/10 /作为请求端点,最后再次调用身份验证过滤器.
这是预期的行为吗?我想要发生的是,addTrailingSlashes一旦添加斜杠就被调用,然后转发请求一次,以便只调用一次身份验证过滤器.
任何想法都将非常感激.
谢谢,内森
在Java Spark Web框架中,路线定义为
get("/", (request, response) -> {
// Show something
Run Code Online (Sandbox Code Playgroud)
});
在我的应用程序中,我定义了多个路由。有什么办法可以获取应用程序的所有公开路由?
我开始更多地进入网络开发。目前,我将 Spark 框架与 Vue 一起用于我制作的少数应用程序。虽然这当然有效,但并不理想。
该项目是使用 Maven(以及用于 Vue 的 NPM)构建的,构建过程如下所示。
所以文件系统看起来像这样
/src/main/java(Spark 框架)
/src/main/resources (Vue)
这会导致一些烦恼。
所以我的问题是:构建应用程序的更好方法是什么?
我将Vue UI与Spark Java后端捆绑在一起。
这两个模块都是独立构建的,可以通过以下结构正常工作:
project
+-- backend
| +-- src
| | +-- main
| | +-- resources
| | +-- public <= Where the jar is picking the static files
| +-- build
| +-- libs <= Gradle Jar output
+-- ui
+-- dist <= Vue build output
Run Code Online (Sandbox Code Playgroud)
在后端,Gradle捆绑backend/src/main/resources/public到Jar中/public。因此,我从复制ui/dist到backend/src/main/resources/public作为jar任务依赖项。
task copyUI(type: Copy) {
from( '../ui/dist')
into( 'src/main/resources/public')
}
jar.dependsOn( copyUI)
Run Code Online (Sandbox Code Playgroud)
Gradle正在复制文件,但是在创建jar之后。
换句话说,我必须创建两次jar才能正确。
我如何指示Gradle在包装/ public前等待复制完成
我的build.gradle罐子部分看起来像这样 …
如何通过Spark 框架配置 Jetty 选项?
当我提交一个大表格时,我遇到了下面的问题。Jetty 的解决方案记录在Form too Large Exception 中
但是 Jetty 使用 Spark Framework 对我隐藏,我将如何配置来解决这个问题。
org.eclipse.jetty.http.BadMessageException: 400: Unable to parse form content
at org.eclipse.jetty.server.Request.getParameters(Request.java:373)
at org.eclipse.jetty.server.Request.getParameter(Request.java:1016)
at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:194)
at spark.Request.queryParams(Request.java:283)
at spark.http.matching.RequestWrapper.queryParams(RequestWrapper.java:141)
at com.jthink.songkong.server.callback.ServerEditSongs.startTask(ServerEditSongs.java:45)
at com.jthink.songkong.server.CmdRemote.lambda$null$62(CmdRemote.java:171)
at spark.RouteImpl$1.handle(RouteImpl.java:72)
at spark.http.matching.Routes.execute(Routes.java:61)
at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:130)
at spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1568)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.Server.handle(Server.java:564)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:317)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
at org.eclipse.jetty.util.thread.Invocable.invokePreferred(Invocable.java:128)
at org.eclipse.jetty.util.thread.Invocable$InvocableExecutor.invoke(Invocable.java:222)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:294)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:199)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:673)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:59
1)
at …Run Code Online (Sandbox Code Playgroud)