2017-11-25 12 views
2

Apache Tomcat에서 호스팅되는 Java Alexa Skills Kit SDK을 사용하는 Alexa Skills logic (스피릿 릿)을 구현하고 있습니다. 그러나 프로젝트를 Apache Sling 기반 서버로 이동해야합니다. OSGi 컨테이너 (Apache Felix)를 기반으로합니다. 슬링 DI 메커니즘이 매우 유용하다는 것을 알게되었습니다. 그러나 Java Alexa Skills Kit SDK는 그러한 사용을 위해 전적으로 준비되지 않은 것 같습니다. 주요 문제는 SDK 서블릿이 일반 Java 서블릿이고 Sling이 SDK 서블릿을 지원하지 않는다는 것입니다. 게다가 SDK는 OSGi 번들조차도 아니다. 슬링 스타일에서 사용하는 것이 좋겠지 만 처음부터 SDK를 복제하고 싶지는 않습니다.슬링 OSGi 컨테이너에서 Alexa 기술 구현

누구나 OSGi 컨테이너에서 스킬 서비스로 스킬을 만들었습니까? 나 혼자서 SlingServlet을 만들어야합니까? Java Alexa Skills Kit SDK는 슬링 서비스와 함께 작동합니까?

답변

1

Java Alexa Skills Kit SDK가 OSGi를 지원하지 않으며 서블릿이 Sling에서 작동하지 않는다는 것이 옳습니다. 그러나 서블릿을 제외한 API의 나머지 부분은 일반 자바 객체로 구성되어 있으므로 슬링과 함께 사용할 수 있습니다. 이것이 서비스와 DI 메커니즘을 사용할 수 있도록 Java Alexa Skills Kit SDK를 슬링 기능으로 포장 한 alexa-skills-sling 라이브러리를 만든 이유입니다. OSGi 번들로

<dependency> 
    <groupId>eu.zacheusz.sling.alexa</groupId> 
    <artifactId>alexa-skills-sling</artifactId> 
    <version>1.2.1</version> 
</dependency> 

설치 :

는 종속성을 추가 할 필요가 그것을 사용합니다. 예를 들어 :
<plugins> 
    <plugin> 
     <groupId>org.apache.sling</groupId> 
     <artifactId>maven-sling-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>install-dependency</id> 
      <goals> 
       <goal>install-file</goal> 
      </goals> 
      <phase>install</phase> 
      <configuration> 
       <!-- install dependency to test AEM Server --> 
       <slingUrl>http://${vm.host}:${vm.port}/apps/alexa/install</slingUrl> 
       <deploymentMethod>WebDAV</deploymentMethod> 
       <user>${vm.username}</user> 
       <password>${vm.password}</password> 
       <groupId>eu.zacheusz.sling.alexa</groupId> 
       <artifactId>alexa-skills-sling</artifactId> 
       <version>${alexa-skills-sling.version}</version> 
       <packaging>jar</packaging> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
</plugins> 

그런 다음 하나의 의도 논리가 바로 구현에 슬링 주석을 추가 구현과 라이브러리에 의해 선택 될 것이다. 의도 로직 구현 및 you can find more examples in this project

@Component 
@Service(IntentHandler.class) 

Here is a very basic example :

@Component 
@Service(IntentHandler.class) 
public class ExampleSimpleIntentHandlerService implements IntentHandler { 

    private static final String SLOT_NAME = "mySlot"; 
    private static final String INTENT_NAME = "myIntent"; 

    @Override 
    public boolean supportsIntent(String intentName) { 
     return INTENT_NAME.equals(intentName); 
    } 

    @Override 
    public SpeechletResponse handleIntent(final SpeechletRequestEnvelope<IntentRequest> requestEnvelope) { 

     final IntentRequest request = requestEnvelope.getRequest(); 
     final Intent intent = request.getIntent(); 
     final Slot slot = intent.getSlot(SLOT_NAME); 

     final String responseMessage; 
     if (slot == null) { 
      responseMessage = format(
        "I got your request, but there is no slot %", 
        SLOT_NAME); 
     } else { 
      responseMessage = format(
        "I got your request. Slot value is %s. Thanks!", 
        slot.getValue()); 
     } 
     return newTellResponse(responseMessage); 
    } 

    private SpeechletResponse newTellResponse(final String text) { 
     return SpeechletResponse.newTellResponse(newPlainTextOutputSpeech(text)); 
    } 

    private PlainTextOutputSpeech newPlainTextOutputSpeech(final String text) { 
     final PlainTextOutputSpeech speech = new PlainTextOutputSpeech(); 
     speech.setText(text); 
     return speech; 
    } 
} 
+1

감사합니다 -이 내가 필요하고 내가 찾던 정확히 것입니다. 이상한 것은 아무도 전에 그것을 한 적이 없다는 것입니다. – John