无法从弹簧靴衫运行生成的罐子

时间:2017-02-14 06:06:52

标签: spring-boot jersey-2.0

我无法使用带有jersey项目的spring-boot运行生成的jar文件。

我遇到的例外是:

Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 1

项目通过IDE(运行Main类)或使用spring-boot完成时运行正常:运行

以下是当前设置的详细信息:

包装:

jar

依赖性:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jersey</artifactId>
  <version>1.5.1.RELEASE</version>
</dependency>

我的泽西配置(ResourceConfig)设置为扫描包

@Component
public class JerseyConfiguration extends ResourceConfig {

    public JerseyConfiguration() {
        packages(true, "com.my.base.jaxrs.packages");
    }

}

spring-boot-maven-plugin配置为: org.springframework.boot

<artifactId>spring-boot-maven-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>repackage</goal>
      </goals>
    </execution>
  </executions>
</plugin>

我也没有使用spring-boot-starter-parent,但是添加了文档中指示的spring-boot-dependencies。

3 个答案:

答案 0 :(得分:1)

我遇到了这个问题,我不想让事情太复杂,所以我只是单独注册了所有的球衣控制器。

@Configuration
public class JerseyConfig extends ResourceConfig {

    JerseyConfig() {

        //  my old version that does not play well with spring boot fat jar        
        /*
            packages(
                    "com.mycompany.api.resources"           
            );
        */

        register(com.mycompany.api.resources.FooController.class);
        register(com.mycompany.api.resources.BarController.class);

}

注意:对于包含大量文件的大型项目,我不建议这样做,它很快就会变得冗长且难以理解且维护繁琐。 也就是说,它是一个可行的解决方案,您可以使用通常的java -jar my-project.jar命令运行jar。

答案 1 :(得分:0)

这是一种解决方法,而不是实际使用的有效解决方案 包(true,&#34; my.package&#34;);

在提到Anton的答案时,我解决了这个解决方案的局限性,它需要具有类级别@Path或@Provider注释的资源:

ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
        provider.addIncludeFilter(new AnnotationTypeFilter(Path.class));
        provider.addIncludeFilter(new AnnotationTypeFilter(Provider.class));
        provider.findCandidateComponents("my.package.here").forEach(beanDefinition -> {
            try {
                LOGGER.info("registering {} to jersey config", beanDefinition.getBeanClassName());
                register(Class.forName(beanDefinition.getBeanClassName()));
            } catch (ClassNotFoundException e) {
                LOGGER.warn("Failed to register: {}", beanDefinition.getBeanClassName());
            }
        });

答案 2 :(得分:0)

或者你可以这样做,

@Configuration
public class JerseyConfig extends ResourceConfig {

    JerseyConfig() {
        BeanConfig beanConfig = new BeanConfig();
        beanConfig.setResourcePackage("com.mycompany.api.resources");
    }
}