春季反应式启动应用程序(2.0.0.rc1)作为WebLogic 12C中的Servlet开始,但NPE在访问时抛出



基于2.0.0.rc1的运行弹簧启动反应性应用程序。它可以用网络嵌入式容器自行起作用。

将其切换到servlet,对依赖项进行整理 - 排除,规定,weblogic.xml指令等,然后部署到WebLogic 12C(12.1.3(容器将成功启动应用程序。但是,当尝试访问由单个控制器处理的其余URL时,WebLogic会抛出NPE。它永远不会到达弹簧控制器。

Error 500--Internal Server Error
java.lang.NullPointerException
    at weblogic.servlet.internal.ServletResponseImpl.sendContentError(ServletResponseImpl.java:713)
    at weblogic.servlet.internal.ServletResponseImpl.sendError(ServletResponseImpl.java:761)
    at weblogic.servlet.internal.ServletResponseImpl.sendError(ServletResponseImpl.java:693)
    at org.springframework.boot.web.servlet.support.ErrorPageFilter.handleErrorStatus(ErrorPageFilter.java:144)
    at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:117)
    at org.springframework.boot.web.servlet.support.ErrorPageFilter.access$000(ErrorPageFilter.java:59)
    at org.springframework.boot.web.servlet.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:90)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:108)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3451)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.__run(WebAppServletContext.java:3417)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
    at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
    at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2280)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2196)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2174)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1632)
    at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:256)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:263)

我将粘贴以下所有相关资源的摘录。第一个引导应用程序:

@SpringBootApplication
@Configuration
//@EnableAutoConfiguration
//@ComponentScan(basePackages = {"ca.corp.uservice", "ca.corp.uservice.filecache"})
//@ImportResource({"/WEB-INF/ws-dispatcher-servlet.xml"})
//@EnableWebSecurity
public class FileCacheBootApp extends SpringBootServletInitializer implements WebApplicationInitializer {
  public static void main(String[] args) {
    SpringApplication.run(FileCacheBootApp.class, args);
  }
  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(FileCacheBootApp.class);
  }
  ...
}

接下来的控制器:

@RestController
@RequestMapping("/filecache")
public class FileCacheController implements FileCacheApi {
  @Autowired
  private FileCacheRepository repo;
  // -------------- GET ---------------
  @GetMapping(value = "{token}")
  @Override public Mono<FileCacheable> get(@PathVariable("token") String token) {
    return repo.findByToken(token).map(f -> load(f));
  }
  @GetMapping(value = "app")
  @Override public Mono<FileCacheable> get(@RequestParam Long appid, @RequestParam String type, @RequestParam Integer langcode) {
    return repo.findByUnique(appid, type, langcode).map(f -> load(f));
   }
  @GetMapping(value = "zip")
  @Override public Mono<FileCacheable> get(@RequestParam String name, @RequestParam Integer langcode) {
    return repo.findByNameAndLang(name, langcode);
  }
  ...
}

最后,POM,春季FMW和Servlet。需要在此处进行一些跳跃以使其在WebLogic容器中运行没有冲突。

    <!-- SPRING FRAMEWORK -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>${spring-boot-version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-api</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-to-slf4j</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-to-slf4j</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <version>${spring-boot-version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
        <version>${spring-boot-version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
        <version>${spring-boot-version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.hibernate.validator</groupId>
                <artifactId>hibernate-validator</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- SERVLET, VALIDATION and EL -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>3.0.1-b04</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</artifactId>
        <version>3.0.1-b09</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.1.1.Final</version>
    </dependency>

weblogic.xml

<weblogic-version>12.1.3</weblogic-version>
<context-root>file-cache-uservice</context-root>
<container-descriptor>
    <prefer-application-packages>
        <package-name>org.springframework.*</package-name>
        <package-name>org.hibernate.*</package-name>
        <package-name>javax.validation.*</package-name>
        <package-name>javax.validation.spi.*</package-name>
        <package-name>org.apache.logging.log4j.*</package-name>
        <package-name>org.slf4j.*</package-name>
    </prefer-application-packages>
</container-descriptor>

我试图尽可能具体,因为信息过度杀伤。如果您想知道更多细节...很高兴提供。

对NPE来源的任何信息或指针都表示赞赏。

解决了它。这一点令人困惑...我添加了boot-web的依赖性:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>${spring-boot-version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.hibernate.validator</groupId>
                <artifactId>hibernate-validator</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

然后一切都开始做出回应。除了您不能单独运行WebFlux启动时,哪种是有意义的。

目前尚不清楚为什么独立(嵌入式容器(不能具有Web依赖性,而外部容器必须才能使用它。但现在起作用。

最新更新