我正在用Java构建一个Play2应用程序,该应用程序将接收几个电话号码并将其发布到发送SMS的rest服务中。

我已经创建了一个控制器,并且我认为该控制器将处理该请求,执行对Java列表的解组。然后我在考虑创建一个SmsService类来处理调用。我不明白的是我应该如何以Play2的方式实现这一点。

我是否在Controller中通过键入new实例化SmsService?还是我用
依赖注入?也许我要为我的春天背景着色,忘掉一切
注入并将所有内容写入控制器?也许使方法静态
并像SmsService.sendSms(numbers)一样使用SmsService

我已经检查了Play2 2.1文件夹后面的示例,但是那里的示例
不处理这种情况。我可能已经错过了文档中的某些内容。

您将如何做?为什么?

短信控制器:

public class Sms extends Controller {

    private static final ObjectMapper mapper = new ObjectMapper();

    @BodyParser.Of(value = BodyParser.Json.class)
    public static Result inviteToReview() {
        ObjectNode result = Json.newObject();

        JsonNode json = request().body().asJson();
        if(json == null) {
            result.put("status", "KO");
            result.put("message", "Missing phone number list [phone_numbers]");
            return badRequest(result);
        }

        List<String> numbers = new ArrayList<String>();
        TypeReference collectionType = new TypeReference<ArrayList<String>>() {
        };
        try {
            numbers = mapper.readValue(json.get("phone_numbers"), collectionType);
        } catch (IOException e) {
            // handle error
        }

        SmsService smsService = new SmsService();
        result = smsService.sendSms(numbers);
        return ok(result);
    }
}

最佳答案

自从我现在得到答案以来,我就是这样做的。

全球:

public class Global extends GlobalSettings {

    private static final Injector INJECTOR = createInjector();

   /**
     * Need for injection.
     *
     * @param controllerClass
     * @param <A>
     * @return
     * @throws Exception
     */
    @Override
    public <A> A getControllerInstance(Class<A> controllerClass) throws Exception {
        return INJECTOR.getInstance(controllerClass);
    }

    private static Injector createInjector() {
        return Guice.createInjector();
    }
}


控制器:

public class Sms extends Controller {

    private static final ObjectMapper mapper = new ObjectMapper();

    @Inject
    private SmsService smsService;

    @BodyParser.Of(value = BodyParser.Json.class)
    public Result invite(){
        ObjectNode result = Json.newObject();
        smsService.sendSms(new ArrayList<String>());
        result.put("status", "OK");
        //cool stuff ehere
        return ok(result);
    }
}


路线:

GET /sms/invite    @controllers.Sms.invite()


建立:

val appDependencies = Seq(
      javaCore,
    "com.google.inject" % "guice" % "3.0",
  )

10-05 18:56