Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为多个Spring引导类分配上下文路径前缀?_Java_Spring_Spring Boot - Fatal编程技术网

Java 如何为多个Spring引导类分配上下文路径前缀?

Java 如何为多个Spring引导类分配上下文路径前缀?,java,spring,spring-boot,Java,Spring,Spring Boot,我的Spring Boot项目中有很多资源。我宁愿让前缀(即/attributes/,/entitites/等)可配置,而不是提供完全静态的路径。以前,我使用了servlet.context-path设置,但我希望在项目中每个包有不同的路径,静态资源有不同的路径 即,从包实体映射到前缀为/{servlet.context path}/Entities/{RequestMapping}的上下文的所有bean,从我的包属性映射到/{servlet.context path}/attributes/{

我的Spring Boot项目中有很多资源。我宁愿让前缀(即/attributes/,/entitites/等)可配置,而不是提供完全静态的路径。以前,我使用了servlet.context-path设置,但我希望在项目中每个包有不同的路径,静态资源有不同的路径


即,从包实体映射到前缀为/{servlet.context path}/Entities/{RequestMapping}的上下文的所有bean,从我的包属性映射到/{servlet.context path}/attributes/{RequestMapping}的bean,而无需指定静态前缀,例如每个bean中的/attributes/static/list。

如果您希望每个包都有前缀RequestMapping,并且不重复slef,那么可以为每个包创建一个抽象控制器;例如:

@RequestMapping(value = "/entities", produces = {MediaType.APPLICATION_JSON_VALUE, MediaTypes.HAL_JSON_VALUE})
public abstract class EntitiesAbstractController {
}

@RequestMapping(value = "/attributes", produces = {MediaType.APPLICATION_JSON_VALUE, MediaTypes.HAL_JSON_VALUE})
public abstract class AttributesAbstractController {
}
然后在控制器中,您将拥有:

@RestController
public class ChildController extends EntitiesAbstractController{
   @GetMapping(value="/PATH_SUFFIX_HERE")
   //method here
}
因此,在您的
servlet.context路径旁边,您将有如下端点:

/{servlet.context-path}/entities/PATH_SUFFIX_HERE
/{servlet.context-path}/attributes/PATH_SUFFIX_HERE

如果希望每个包都有前缀RequestMapping,并且不重复slef,那么可以为每个包创建一个抽象控制器;例如:

@RequestMapping(value = "/entities", produces = {MediaType.APPLICATION_JSON_VALUE, MediaTypes.HAL_JSON_VALUE})
public abstract class EntitiesAbstractController {
}

@RequestMapping(value = "/attributes", produces = {MediaType.APPLICATION_JSON_VALUE, MediaTypes.HAL_JSON_VALUE})
public abstract class AttributesAbstractController {
}
然后在控制器中,您将拥有:

@RestController
public class ChildController extends EntitiesAbstractController{
   @GetMapping(value="/PATH_SUFFIX_HERE")
   //method here
}
因此,在您的
servlet.context路径旁边,您将有如下端点:

/{servlet.context-path}/entities/PATH_SUFFIX_HERE
/{servlet.context-path}/attributes/PATH_SUFFIX_HERE

我有相同的问题,我已解决此配置:

@Configuration
public class FeaturesRestConfiguration implements WebMvcConfigurer {
  @Override
  public void configurePathMatch(PathMatchConfigurer configurer) {
    configurer.addPathPrefix(
        "apiPackage1",
        HandlerTypePredicate.forAnnotation(RestController.class)
            .and(
                HandlerTypePredicate.forBasePackage(
                    "com.projects.api.package1")));
  }
}
所有带有RestController注释的java类都会在url中自动添加apiPackage1前缀


在Spring Boot 2.2应用程序上进行了测试

我遇到了相同的问题,我已解决了此配置:

@Configuration
public class FeaturesRestConfiguration implements WebMvcConfigurer {
  @Override
  public void configurePathMatch(PathMatchConfigurer configurer) {
    configurer.addPathPrefix(
        "apiPackage1",
        HandlerTypePredicate.forAnnotation(RestController.class)
            .and(
                HandlerTypePredicate.forBasePackage(
                    "com.projects.api.package1")));
  }
}
所有带有RestController注释的java类都会在url中自动添加apiPackage1前缀


在Spring Boot 2.2应用程序上测试

您所说的路径是什么意思?是端点名称吗?是的,上下文路径…你说的路径是什么意思?是端点名称吗?是的,上下文路径…有没有进一步深入的方法?我有多个控制器,每个包,并希望分组这些uder一个共同的前缀。明白了。所以类被递归地检查,所以父类最终成为所有子类的前缀?我不这么认为!我认为你只能有一个继承层次!但是您可以尝试一下,并告诉我们您将得到的结果。看起来,虽然可以为@RequestMapping注释使用父类,但不能为子类的子路径添加额外的父类,只能在单个方法上。哪种类型的前缀违背了通用前缀的目的。有没有进一步深入的方法?我有多个控制器,每个包,并希望分组这些uder一个共同的前缀。明白了。所以类被递归地检查,所以父类最终成为所有子类的前缀?我不这么认为!我认为你只能有一个继承层次!但是您可以尝试一下,并告诉我们您将得到的结果。看起来,虽然可以为@RequestMapping注释使用父类,但不能为子类的子路径添加额外的父类,只能在单个方法上。哪种类型违背了通用前缀的目的。