我想用spark + java + hibernate + postgres
来注册用户这是我的代码:
post("/registrar", (request, response) -> {
EntityManagerFactory emf = Persistence.
createEntityManagerFactory("compradorcitoPU");
EntityManager em = emf.createEntityManager();em.getTransaction().begin();
em.persist(u);
em.getTransaction().commit();
em.close(); return null; });
但出现此错误:
INFO spark.webserver.MatcherFilter - 请求的路线 [/ registrarnull]尚未在Spark中映射
答案 0 :(得分:8)
我有类似的问题。我要归还的物品很大,我想把它们写出来。所以,我的软件看起来像这样:
post("/apiserver", "application/json", (request, response) -> {
log.info("Received request from " + request.raw().getRemoteAddr());
ServerHandler handler = new ServerHandler();
return handler.handleRequest(request, response);
});
在我的处理程序中,我获得了原始的HttpResponse对象,打开了它的OutputStream并像这样写了它:
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(response.raw().getOutputStream(), records);
因为我知道我已经在OutputStream上写了调用者当时要求的内容(或错误),我想我可以返回null。我的程序运行正常。 Spark会按预期将请求路由到我的处理程序。而且,由于我正在编写原始OutputStream,因此我回到了客户端的预期。但是,我一直在服务器日志中看到消息“/ apiserver route not defined”。
在查看Spark文档时,它说:
Spark应用程序的主要构建块是一组路由。路线由三个简单的部分组成:
动词(get,post,put,delete,head,trace,connect,options)
路径(/ hello,/ users /:name)
回调(请求,响应) - > {}
显然,Spark不知道你在原始HttpResponse上写了什么,作为一个web服务器,你应该向调用者提供一些响应。因此,如果您的响应为空,则表示您尚未满足提供回调的要求,并且您会收到错误,即即使Spark按预期行为也没有找到映射。只需返回一个响应(null不是响应,“200 OK”就是),错误就会消失。
[编辑]拼写和语法。
答案 1 :(得分:3)
不要“返回null”而是返回空字符串或其他东西
答案 2 :(得分:2)
正如此issue的注释中所解释的,SparkJava认为返回null意味着路由尚未映射,因此它会记录错误消息并回复404状态的响应。
要避免此类行为,您必须返回一个String(可能为空)。 错误消息将消失,并且将回复String作为正文和200状态的响应。
答案 3 :(得分:1)
在我的情况下,我必须实施选项请求以取悦预检CORS检查:
options("/*", (request,response)->{
String accessControlRequestHeaders = request.headers("Access-Control-Request-Headers");
if (accessControlRequestHeaders != null) {
response.header("Access-Control-Allow-Headers", accessControlRequestHeaders);
}
String accessControlRequestMethod = request.headers("Access-Control-Request-Method");
if(accessControlRequestMethod != null){
response.header("Access-Control-Allow-Methods", accessControlRequestMethod);
}
return "OK";
});