Ninja 框架未获取 POST 数据或查看 NinjaProperties
Posted
技术标签:
【中文标题】Ninja 框架未获取 POST 数据或查看 NinjaProperties【英文标题】:Ninja framework not getting POST data or seeing NinjaProperties 【发布时间】:2014-09-04 21:55:18 【问题描述】:这里有两个问题,可能是两个问题,或者可能有相同的根源:它们都感觉像是某个地方的配置错误,因此将它们放在一起。如果这使问题令人困惑,请提前道歉......
我正在使用 Ninja Framework,仍然从 Hello World 示例开始学习。我可以使用 Routes、Controller 和 html OK 为页面提供 GET 和 POST。
如果相关的话,我正在一个新的 CentOS VM 上运行,使用 NetBeans 编写,Firefox 进行测试。我已经重启了 Ninja(很多次)。
问题 1:NinjaProperties 在代码中不可见。我已经明白我可以把,例如
import com.google.inject.Inject;
public abstract class PersistDB
@Inject
NinjaProperties ninjaProperties;
...
protected void loadProps()
dbReadServer = ninjaProperties.getWithDefault(DB_READ_SERVER_PROP, DBSERVER_DEFAULT);
...
public class UsersDB
public UsersDB()
loadProps();
并让我的模型代码访问 application.conf 文件以提取属性。但是 ninjaProperties 会返回 null。
问题 2:Ninja docs 中描述的 JSON 解析在控制器签名中添加具有正确字段名称的简单类导致 JSON 在幕后被翻译不起作用。我可以将具有正确字段的类添加到 Controller 方法签名,但它始终为空。使用 GSON,我可以为自己提取对象,因此我有一个解决方法,但这也证实了它在 Ninja 中不起作用。
代码非常接近示例:
package controllers;
public class UserRegisterReq
String email;
String identName;
String password;
和
package controllers;
import com.google.inject.Singleton;
import models.user.User;
import models.user.UserResult;
import ninja.Context;
import ninja.Result;
import ninja.Results;
import ninja.session.Session;
@Singleton
public class UserController
...
public Result doRegisterPost(UserRegisterReq req, Context context)
Session session = context.getSession();
UserResult ur;
ur = User.registerUser(req.email, req.password, req.identName);
...
有什么想法吗? 在此先感谢...
【问题讨论】:
如何获取或创建 UsersDB 的实例?class User public static UsersDB usersDB = new UsersDB();
(现在,我敢说有一个更整洁的解决方案)
好的...编辑了我的答案。很明显,“新”会破坏依赖注入。我在下面解释了一下。
拉夫,谢谢。注射链不是我发现的要求。感谢您提供非常清晰的解释。要实现这一点,需要对您的答案进行补充:而不是从构造函数调用 loadProps() 我还必须 @Inject loadProps 的定义。
【参考方案1】:
没有代码真的很难说你的应用为什么不工作。这两件事都应该开箱即用,因此可以在生产应用程序和我们的集成测试中完美运行。
关于 1) 的一些想法 这是一个工作示例: https://github.com/ninjaframework/ninja/blob/develop/ninja-servlet-integration-test/src/main/java/controllers/ApplicationController.java
如您所见,NinjaProperties 被注入并在那里工作。只需将其与您的代码进行比较...应该可以直接修复。
根据您的记录,很清楚发生了什么。您使用的是“新”。如果您使用“新”,您将破坏任何注入框架。如果您 @Inject 您的 UsersDB 到您的控制器中,然后在执行的 usersDb 上执行方法,它将起作用。在这些类中使用 new 并且不要使用 @Inject 。或者使用@Inject,也可以使用@Inject 你注入的那个类。这与 Java 下的注入框架(尤其是 Guice)的工作方式有关。
关于 2) 的一些想法
这里又是一些可以工作并解析 Json 的代码: https://github.com/ninjaframework/ninja/blob/develop/ninja-servlet-integration-test/src/main/java/controllers/PersonController.java
也应该开箱即用。但有一件事 - 你必须确保请求包含标头 content-type: application/json - 否则 Ninja 无法知道如何解析传入的请求。
我相信这很容易解决。让我们知道这是否有帮助!
【讨论】:
谢谢。我也认为他们应该工作。我已经扩展了第 1 部分的代码。我认为这涵盖了相关代码,并且我认为与您指向的示例相匹配(以及我从文档中理解的内容)。当我有时间尝试您的建议时,我会回到第 2 部分。 re 第 2 部分:当然,两个小学生错误组合在一起 - 我没有设置内容类型(因为我在 Gson 重用的 web/js 旧代码强制它并且不需要)而且我还没有公开 UserRegisterReq 的字段。这已经解决了第 2 部分。谢谢。 (但仍然找不到第 1 部分中的配置。) 我发现注入 NinjaProperties 在控制器中有效(只是复制字段 def 和测试访问),但在我的模型中无效。这是故意的吗?以上是关于Ninja 框架未获取 POST 数据或查看 NinjaProperties的主要内容,如果未能解决你的问题,请参考以下文章