如何在Spark服务器上运行java程序?

时间:2017-12-12 17:27:41

标签: java web-applications twilio spark-java

我正在尝试自动调用呼叫,以便当用户调用Twilio号码时,代码将生成X​​ML并将其作为HTTP响应发送给调用者。他们网页上的例子是:

@SuppressWarnings("serial")
@WebServlet("/voice")
public class IncomingCallServlet extends HttpServlet {
  // Handle HTTP POST to /voice
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // Create a TwiML builder object
    VoiceResponse twiml = new VoiceResponse.Builder()
        .say(new Say.Builder("Hello world!")
              .voice(Say.Voice.ALICE)
              .build())
        .build();

    // Render TwiML as XML
    response.setContentType("text/xml");

    try {
      response.getWriter().print(twiml.toXml());
    } catch (TwiMLException e) {
      e.printStackTrace();
    }



  }
}

但是我怎么能让它运行,因为没有主要方法?我正在使用spark在本地端口上运行它,然后使用ngrok为应用程序创建webhook。它有效,如果我有一个main,但这里的例子没有给出任何。

有关如何运行此代码以及生成XML的任何建议。

2 个答案:

答案 0 :(得分:2)

有趣的是,我在代码中看不到Spark的任何引用,它可以在任何Java Web容器上运行,前提是您在格式良好的web.xml中声明了servlet。如果我理解你的问题和代码正确提取,你似乎愿意依赖嵌入Spark的Jetty服务器来加载这个servlet。

如果你想利用Spark并避免明确声明你的servlet的麻烦,你可以写这样的东西(假设你正在运行Java 8):

import com.twilio.twiml.Say;
import com.twilio.twiml.VoiceResponse;

import static spark.Spark.*

public class IncomingCall {

  public static void main(String[] args) {

    // You might want to pass the listen port
    // e.g as CLI argument or system property
    port(4567);
    post("/voice", (request, response) -> {
      // Create a TwiML builder object
      VoiceResponse twiml = new VoiceResponse.Builder()
        .say(new Say.Builder("Hello world!")
          .voice(Say.Voice.ALICE)
          .build())
        .build();

      // Render TwiML as XML
      response.type("text/xml");
      try {
          return twiml.toXml();
      } catch (TwiMLException e) {
          // This will result in a HTTP 500
          throw new RuntimeException(e);
      }
    }
  }
}

答案 1 :(得分:1)

可以实现SparkApplication接口,在web.xml中声明一个过滤器,然后根据documentation在另一个Web服务器中运行它。