2016-12-08 4 views
1

Я пытаюсь превратить this example в приложение Spring Boot, проблема, лежащая в том, что RestfulServer - это сервлет, и я действительно не пытаюсь сделать отдельное приложение, но один, который более или менее расширяет этот сервлет Проблема в том, что я сталкиваюсь с тем, что все, что я пробовал с WebApplicationInitializer и SpringBootApplicationInitializer, заключается в том, что они не инициализируют сервлет, а затем выполняют другие классы @Configuration. Как я могу преобразовать класс JpaServerDemo в Spring Boot? (Примечание: мы надеваем «т нужен 2-й сервлет)Как я могу установить приложение Spring Boot на внешний сервлет?

обновление это последняя вещь, которую я пытался, но я также пробовал различные итерации просто WebApplicationInitializer или делать вещи в configure метод, который кажется сложным, потому что он не имеет servletContext и onStartup не имеют ApplicationContext

@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 


    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     super.onStartup(servletContext); 

     RestfulServer server = new RestfulServer(); 
     servletContext.addServlet("restful", server); 
      /* 
     * We want to support FHIR DSTU3 format. This means that the server 
     * will use the DSTU3 bundle format and other DSTU3 encoding changes. 
     * 
     * If you want to use DSTU1 instead, change the following line, and change the 3 occurrences of dstu2 in web.xml to dstu1 
     */ 
     server.setFhirContext(FhirContext.forDstu3()); 
     WebApplicationContext myAppCtx = this.createRootApplicationContext(servletContext); 

     // Get the spring context from the web container (it's declared in web.xml) 

    /* 
    * The BaseJavaConfigDstu3.java class is a spring configuration 
    * file which is automatically generated as a part of hapi-fhir-jpaserver-base and 
    * contains bean definitions for a resource provider for each resource type 
    */ 
     List<IResourceProvider> beans = myAppCtx.getBean("myResourceProvidersDstu3", List.class); 
     server.setResourceProviders(beans); 

     /* 
     * The system provider implements non-resource-type methods, such as 
     * transaction, and global history. 
     */ 
     server.setPlainProviders(myAppCtx.getBean("mySystemProviderDstu3", JpaSystemProviderDstu3.class)); 

    /* 
    * The conformance provider exports the supported resources, search parameters, etc for 
    * this server. The JPA version adds resource counts to the exported statement, so it 
    * is a nice addition. 
    */ 
     IFhirSystemDao<Bundle, Meta> systemDao = myAppCtx.getBean("mySystemDaoDstu3", IFhirSystemDao.class); 
     DaoConfig daoConfig = myAppCtx.getBean(DaoConfig.class); 
     JpaConformanceProviderDstu3 confProvider = new JpaConformanceProviderDstu3(server, systemDao, daoConfig); 
     confProvider.setImplementationDescription("Example Server"); 
     server.setServerConformanceProvider(confProvider); 

     /* 
     * Enable ETag Support (this is already the default) 
     */ 
     server.setETagSupport(ETagSupportEnum.ENABLED); 

    /* 
    * This server tries to dynamically generate narratives 
    */ 
     FhirContext ctx = server.getFhirContext(); 
     ctx.setNarrativeGenerator(new 

       DefaultThymeleafNarrativeGenerator()); 

     /* 
     * Default to JSON and pretty printing 
     */ 
     server.setDefaultPrettyPrint(true); 
     server.setDefaultResponseEncoding(EncodingEnum.JSON); 

     /* 
     * -- New in HAPI FHIR 1.5 -- 
     * This configures the server to page search results to and from 
     * the database, instead of only paging them to memory. This may mean 
     * a performance hit when performing searches that return lots of results, 
     * but makes the server much more scalable. 
     */ 
     server.setPagingProvider(myAppCtx.getBean(DatabaseBackedPagingProvider.class)); 

    /* 
    * Load interceptors for the server from Spring (these are defined in FhirServerConfig.java) 
    */ 
     Collection<IServerInterceptor> interceptorBeans = myAppCtx.getBeansOfType(IServerInterceptor.class).values(); 
     for (
       IServerInterceptor interceptor : interceptorBeans) 

     { 
      server.registerInterceptor(interceptor); 
     } 

     /* 
     * If you are hosting this server at a specific DNS name, the server will try to 
     * figure out the FHIR base URL based on what the web container tells it, but 
     * this doesn't always work. If you are setting links in your search bundles that 
     * just refer to "localhost", you might want to use a server address strategy: 
     */ 
     //setServerAddressStrategy(new HardcodedServerAddressStrategy("http://example.com/fhir/baseDstu2")); 

     /* 
     * If you are using DSTU3+, you may want to add a terminology uploader, which allows 
     * uploading of external terminologies such as Snomed CT. Note that this uploader 
     * does not have any security attached (any anonymous user may use it by default) 
     * so it is a potential security vulnerability. Consider using an AuthorizationInterceptor 
     * with this feature. 
     */ 
     server.registerProvider(myAppCtx.getBean(TerminologyUploaderProviderDstu3.class)); 


    } 

    @Override 
    protected SpringApplicationBuilder configure(final SpringApplicationBuilder builder) { 
     return builder; 
    } 

    public static void main(String[] args) { 
     configureApplication(new SpringApplicationBuilder()).run(args); 
    } 

    private static SpringApplicationBuilder configureApplication(final SpringApplicationBuilder builder) { 
     return builder.sources(Application.class); 
    } 
} 
+0

вы можете добавить, как вы настроили WebApplicationInitializer – kuhajeyan

+0

@kuhajeyan включал последнее, что я пытался, я пытался несколько вещей – xenoterracide

ответ

1

Это похоже на работу, я добавил @WebServlet к классу, и вводил WebApplicationContext с использованием Spring 4.3 в annotationless функции впрыска конструктора. Я также добавил @ServletComponentScan к моему Application, который находится в том же пакете

@WebServlet("/fhir/*") 
public class FhirServlet extends RestfulServer { 

    private static final long serialVersionUID = 3341258540126825379L; 
    private final WebApplicationContext myAppCtx; 

    public FhirServlet(WebApplicationContext myAppCtx) { 
     this.myAppCtx = myAppCtx; 
    } 

    @Override 
    protected void initialize() throws ServletException { 
     this.setFhirContext(FhirContext.forDstu3()); 
     this.setServerAddressStrategy(new IncomingRequestAddressStrategy()); 
     this.setDefaultPrettyPrint(true); 
     this.setDefaultResponseEncoding(EncodingEnum.JSON); 
     this.setETagSupport(ETagSupportEnum.ENABLED); 

     /* 
     * The BaseJavaConfigDstu3.java class is a spring configuration 
     * file which is automatically generated as a part of hapi-fhir-jpaserver-base and 
     * contains bean definitions for a resource provider for each resource type 
     */ 
     List<IResourceProvider> beans = myAppCtx.getBean("myResourceProvidersDstu3", List.class); 
     setResourceProviders(beans); 

     /* 
     * The system provider implements non-resource-type methods, such as 
     * transaction, and global history. 
     */ 
     setPlainProviders(myAppCtx.getBean("mySystemProviderDstu3", JpaSystemProviderDstu3.class)); 

     /* 
     * The conformance provider exports the supported resources, search parameters, etc for 
     * this server. The JPA version adds resource counts to the exported statement, so it 
     * is a nice addition. 
     */ 
     IFhirSystemDao<Bundle, Meta> systemDao = myAppCtx.getBean("mySystemDaoDstu3", IFhirSystemDao.class); 
     JpaConformanceProviderDstu3 confProvider = new JpaConformanceProviderDstu3(this, systemDao, myAppCtx.getBean(DaoConfig.class)); 
     confProvider.setImplementationDescription("Example Server"); 
     setServerConformanceProvider(confProvider); 

     /* 
     * This server tries to dynamically generate narratives 
     */ 
     getFhirContext().setNarrativeGenerator(new DefaultThymeleafNarrativeGenerator()); 

     /* 
     * -- New in HAPI FHIR 1.5 -- 
     * This configures the server to page search results to and from 
     * the database, instead of only paging them to memory. This may mean 
     * a performance hit when performing searches that return lots of results, 
     * but makes the server much more scalable. 
     */ 
     setPagingProvider(myAppCtx.getBean(DatabaseBackedPagingProvider.class)); 

     /* 
     * Load interceptors for the server from Spring (these are defined in FhirServerConfig.java) 
     */ 
     Collection<IServerInterceptor> interceptorBeans = myAppCtx.getBeansOfType(IServerInterceptor.class).values(); 
     for (IServerInterceptor interceptor : interceptorBeans) { 
      this.registerInterceptor(interceptor); 
     } 

     /* 
     * If you are hosting this server at a specific DNS name, the server will try to 
     * figure out the FHIR base URL based on what the web container tells it, but 
     * this doesn't always work. If you are setting links in your search bundles that 
     * just refer to "localhost", you might want to use a server address strategy: 
     */ 
     //setServerAddressStrategy(new HardcodedServerAddressStrategy("http://example.com/fhir/baseDstu2")); 

     /* 
     * If you are using DSTU3+, you may want to add a terminology uploader, which allows 
     * uploading of external terminologies such as Snomed CT. Note that this uploader 
     * does not have any security attached (any anonymous user may use it by default) 
     * so it is a potential security vulnerability. Consider using an AuthorizationInterceptor 
     * with this feature. 
     */ 
     registerProvider(myAppCtx.getBean(TerminologyUploaderProviderDstu3.class)); 
    } 
}