我正在使用 Java Spark 构建 REST 服务器,我想知道以下两种用于定义路径参数的语法之间的区别,使用:path-parametervs {path-parameter}:
path("/containers/:container-id", () -> { ...} )
path("/shipments/{shipment-id}", () -> { ... } )
Run Code Online (Sandbox Code Playgroud)
有一次,当查询路径上的路径参数/{handler-id}(嵌套在/v1和 中/handlers)时,我不得不将语法从:表单更改为{}表单,以使 Sparknull在查询handler-id.
那么这两种语法有什么区别呢?
我正在尝试设置简单的 Spark REST 示例,如下所述: http: //sparkjava.com/documentation.html
当我浏览到: http://localhost:4567/hello
我收到此错误:
[qtp346024113-15] WARN org.eclipse.jetty.server.HttpChannel - //localhost:4567/hello
java.lang.NoSuchMethodError: javax.servlet.http.HttpServletResponse.getHeaders(Ljava/lang/String;)Ljava/util/Collection;
at spark.utils.GzipUtils.checkAndWrap(GzipUtils.java:64)
at spark.webserver.MatcherFilter.doFilter(MatcherFilter.java:251)
at spark.webserver.JettyHandler.doHandle(JettyHandler.java:61)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
at org.eclipse.jetty.server.Server.handle(Server.java:517)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:308)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)
看起来类路径有问题,但我不知道缺少哪些依赖项。
我的 Spark 的 pom.xml 中的依赖项如下:
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.3.6.v20151106</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-http</artifactId>
<version>9.3.6.v20151106</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-util</artifactId>
<version>9.3.6.v20151106</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-io</artifactId>
<version>9.3.6.v20151106</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>websocket-server</artifactId>
<version>9.3.3.v20150827</version> …Run Code Online (Sandbox Code Playgroud) 我正在尝试为java微服务添加一个restful api.为此,我使用spark:
http://sparkjava.com/documentation.html
我创建了一个非常简单的类,它代表了api.那堂课在这里:
public class Routes {
public void establishRoutes(){
get("/test", (req, res) -> "Hello World");
after((req, res) -> {
res.type("application/json");
});
exception(IllegalArgumentException.class, (e, req, res) -> {
res.status(400);
});
}
Run Code Online (Sandbox Code Playgroud)
现在,运行Routes.establishRoutes()应该站起来,如果有人决定访问http:// localhost:4567/test,它将显示"Hello World" .这确实有效.欢呼!
下一步是对代码进行单元测试.不幸的是,我的单元测试没有成功.spark文档没有详细说明进行测试的合理方式,因此我所拥有的内容是根据我在网络上找到的示例拼凑而成的.这是我的Junit测试:
public class TestRoutes {
@Before
public void setUp() throws Exception {
Routes newRoutes = new Routes();
newRoutes.establishRoutes();
}
@After
public void tearDown() throws Exception {
stop();
}
@Test
public void testModelObjectsPOST(){
String testUrl = "/test";
ApiTestUtils.TestResponse res = ApiTestUtils.request("GET", testUrl, null); …Run Code Online (Sandbox Code Playgroud) 使用SpringBoot,您可以获得@SpringBootApplication注释,但与纯Java Java框架相同的是什么?
IntelliJ创建了一个Maven项目,我添加了spark依赖项,但是运行安装目标,我获得了一个没有清单的5 KB jar.不是可执行的jar.
所述pom.xml创建迄今如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sparkdemo</groupId>
<artifactId>sparkdemo</artifactId>
<version>1.0 </version>
<packaging>jar</packaging>
<name>sparkdemo</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.5.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<optimize>true</optimize>
<debug>true</debug>
</configuration>
</plugin>
</plugins>
</build>
</project>
Run Code Online (Sandbox Code Playgroud)
非常感谢任何建议....谢谢!
我正在开发一个 SparkJava(不是 Apache Spark)应用程序,我想在前置过滤器和后置路由之间共享一个对象。过滤器和路由在不同的类中定义。我不愿意继续使用会话,因为它是一个移动应用程序 json api,从理论上讲,它应该是无会话的。变量范围应该是从请求处理开始到结束。
before(Main.API_PROTECTED + "/*", (req, res) -> {
String token = req.headers("Authorization");
if (token == null | "".equals(token)) {
halt(401, "You're not welcome.");
} else {
Partner partner = new PartnerDAO().getPartnerByToken(token.replace("Bearer ", ""));
if (partner == null) {
halt(401, "You're not welcome.");
}
}
});
Run Code Online (Sandbox Code Playgroud)
有上面的 before 过滤器,我想从中与下面的 post 路由共享合作伙伴对象:
post(Main.API_PROTECTED + "/vendors",
(req, res) -> {
// Do stuff to insert Vendors in the Database, verifying access control using the partner object
return ""; …Run Code Online (Sandbox Code Playgroud) 我对所有这些事情都很陌生,但希望你们能帮我理解它是如何运作的.我有一个带字段的表格.我如何从客户端获取数据?正在寻找一些信息,但无法找到.
<form action="/login" method="POST">
<fieldset>
<legend>MemberId</legend>
<div class="form-group">
<div class="row colbox">
<div class="col-lg-4 col-sm-4">
<label for="txt_memberid" class="control-label">MemberId</label>
</div>
<div class="col-lg-8 col-sm-8">
<input class="form-control" id="txt_memberid" name="txt_memberid" placeholder="MemberId" type="text" value="" />
<span class="text-danger"></span>
</div>
</div>
</div>
<legend>Login</legend>
<div class="form-group">
<div class="row colbox">
<div class="col-lg-4 col-sm-4">
<label for="txt_username" class="control-label">Username</label>
</div>
<div class="col-lg-8 col-sm-8">
<input class="form-control" id="txt_username" name="txt_username" placeholder="Username" type="text" value="" />
<span class="text-danger"></span>
</div>
</div>
</div>
<div class="form-group">
<div class="row colbox">
<div class="col-lg-4 col-sm-4">
<label for="txt_password" class="control-label">Password</label>
</div>
<div class="col-lg-8 col-sm-8">
<input class="form-control" …Run Code Online (Sandbox Code Playgroud) 使用Spark,我最终得到了一些像这样的代码:
post("/auth/login", { req, res ->
val body = parseBody(req.body())
val assertion = body["assertion"]
if (assertion == null) {
halt(400)
return null
}
// ...snip...lots more code
})
Run Code Online (Sandbox Code Playgroud)
哪个很好用,除了......它不能编译 - 我明白了'return' is not allowed here.
我可以将lambda的剩余部分放在一个else块中,但我宁愿不想最大限度地减少压痕.
那么如何"短路"lambda以返回null?
我在客户端使用Java和Angular 1的Spark。将请求发送到服务器时,我不断收到此“ -1”错误。错误是“所请求的资源上没有'Access-control-allow-origin'标头。因此,不允许访问源' http:// localhost:4567 '。”
我知道这是一个CORS问题,因此我添加了标头'Access-Control-Allow-Origin':'*'并将其也添加到服务器端的响应中。不幸的是,这似乎无法解决我的问题。
需要您的帮助,谢谢!
使用直接HTML页面作为Spark模板的最简单方法是什么(IE,我不想通过TemplateEngine实现).
我可以使用模板引擎,如下所示:
Spark.get("/test", (req, res) -> new ModelAndView(map, "template.html"), new MustacheTemplateEngine());
Run Code Online (Sandbox Code Playgroud)
我尝试使用没有引擎的ModelAndView:
Spark.get("/", (req, res) -> new ModelAndView(new HashMap(), "index.html"));
Run Code Online (Sandbox Code Playgroud)
但是,得到的只是我的模型和视图的toString()方法:spark.ModelAndView@3bdadfd8.
我正在考虑编写自己的引擎并实现render()来执行IO来提供html文件,但是有更好的方法吗?
从列表中创建JavaRDD的常用方法是使用 JavaSparkContext.parallelize(List)
但是,Spark 2.0 SparkSession用作入口点,我不知道如何从List创建JavaRDD
我正在尝试将端口80绑定到我的Spark服务器:
import static spark.Spark.get;
import static spark.Spark.port;
public class Main {
public static void main(String[] args) {
port(80);
get("/hello", (request, response) -> "hello world");
}
}
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,我收到以下错误:
22:51:56.067 [Thread-0] ERROR spark.Spark - ignite failed
java.net.SocketException: Permission denied
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:298)
at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.server.Server.doStart(Server.java:431)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at spark.embeddedserver.jetty.EmbeddedJettyServer.ignite(EmbeddedJettyServer.java:149)
at spark.Service.lambda$init$2(Service.java:496)
at java.lang.Thread.run(Thread.java:748)
Run Code Online (Sandbox Code Playgroud)
我在我OS的任何地方搜索,如果有任何连接绑定到端口80,但我没有找到.
有什么解决方案吗?
我正在尝试在 Spark 中使用 Bazel 构建它来运行“hello world”服务器,但我收到此错误:
$ bazel run //:app
INFO: Analysed target //:app (0 packages loaded).
INFO: Found 1 target...
Target //:app up-to-date:
bazel-bin/app.jar
bazel-bin/app
INFO: Elapsed time: 0.201s, Critical Path: 0.00s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action
INFO: Build completed successfully, 1 total action
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at spark.Service.<clinit>(Service.java:56)
at spark.Spark$SingletonHolder.<clinit>(Spark.java:51)
at spark.Spark.getInstance(Spark.java:55)
at spark.Spark.<clinit>(Spark.java:61)
at io.app.server.Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 5 …Run Code Online (Sandbox Code Playgroud) 我正在使用Spark 框架创建一个 Web 应用程序,并且我一直在浏览他们网站上的教程。目前,我正在处理他们的模板部分,但是我似乎无法让项目识别出我的 css 和我的模板在我的资源文件夹中。
我正在使用 Netbeans 和 Maven 来管理我的依赖项。
谁能帮我弄清楚如何在这种环境中适当地设置我的相对路径/创建我的项目文件夹?我是 Maven 和 Spark 的新手,所以请放轻松。
spark-java ×13
java ×7
maven ×2
rest ×2
bazel ×1
cors ×1
http ×1
httprequest ×1
jar ×1
junit ×1
kotlin ×1
netbeans ×1
unit-testing ×1
url-routing ×1