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的主要内容,如果未能解决你的问题,请参考以下文章

获取 CORS 未获取标题的 Post 问题

ninja: fatal: chdir to '/out/Release' - 没有这样的文件或目录

Ninja 框架使用 Maven 安装错误

实体框架数据未使用 Wcf 服务保存或更新

tp框架查看未空 和不为空的字段,很有效果

Ninja 框架无法将表单解析为 Java 对象