在Spring Boot应用程序@RestController中获取信息的哪种模式更好,以及如何指定ANY @Mapping?

时间:2019-03-09 22:13:35

标签: java spring rest spring-boot

我在Spring Boot应用程序中有 @RestController

@PutMapping("{table}/{key}")
    public void update(@PathVariable("tables") String tableName,
                               @PathVariable("key") String key,
                               @RequestBody Entity entity) {
    ... 
    }

将此映射转换为:

@PutMapping("{table}/{key}")
        public void update(@RequestBody Entity entity) {
        ... 
        }

,并希望来自 @PathVariable 的信息将位于@RequestBody 内部。

原因:我有一个另一个@RestController ,我可以在其中收到AnotherEntity anotherEntity。这种架构风格使我可以在服务层中创建通用层次

问题1 :这是一个不错的模式吗?完美的 REST 服务是否很好?还是应该避免使用它? 问题2 :在这种情况下,我不使用 @PathVariable ,而只需要指定 someWord / SomeOtherWord 作为 @PutMapping 路径。有没有某种方法可以指定 任何/任何 之类的东西,而无需intellij检查我应该使用它?

更新:架构示例

public abstract class Validator<T> {
    public abstract void validate(T t);
}

public class FirstEntityValidator extends Validator<FirstEntity> {
     public void validate(FirstEntity entity){
     ...
     }
}

public class SecondEntityValidator extends Validator<SecondEntity> {
     public void validate(SecondEntity entity){
     ...
     }
}

public abstract class EntityService<T> {

    private Validator<T> validator;

    public EntityService(Validator<T> validator){
      this.validator = validator;
    }
}

public class FirstEntityService extends EntityService<FirstEntity> {

    public FirstEntityService(FirstEntityValidator<FirstEntity> validator){
       super(validator);
    }
}

public class SecondEntityService extends EntityService<SecondEntity> {

    public SecondEntityService(SecondEntityValidator<SecondEntity> validator){
       super(validator);
    }
}

1 个答案:

答案 0 :(得分:2)

我会避免这样的事情。 您应该像分离服务那样分离REST控制器。 如果您只需要为一个实体更改某些内容,则无论如何都需要重构所有内容或生成一些难看的代码。

我认为您正在尝试将存储库公开为REST Web服务。 Spring可以为您解决这个问题。 看一下这个: https://docs.spring.io/spring-data/rest/docs/current/reference/html/

使用界面。 不要使用任何抽象类。 在较大的项目中,这是没有必要的,并且可能会非常困难

这样会更好:

  _OPENMP = '201511'
  OMP_DYNAMIC = 'FALSE'
  OMP_NESTED = 'FALSE'
  OMP_NUM_THREADS = '36'
  OMP_SCHEDULE = 'DYNAMIC'
  OMP_PROC_BIND = 'FALSE'
  OMP_PLACES = ''
  OMP_STACKSIZE = '139738199011328'
  OMP_WAIT_POLICY = 'PASSIVE'
  OMP_THREAD_LIMIT = '4294967295'
  OMP_MAX_ACTIVE_LEVELS = '2147483647'
  OMP_CANCELLATION = 'FALSE'

OPENMP DISPLAY ENVIRONMENT BEGIN
   _OPENMP='201611'
  [host] OMP_ALLOCATOR='omp_default_mem_alloc'
  [host] OMP_CANCELLATION='FALSE'
  [host] OMP_DEFAULT_DEVICE='0'
  [host] OMP_DISPLAY_ENV='TRUE'
  [host] OMP_DYNAMIC='FALSE'
  [host] OMP_MAX_ACTIVE_LEVELS='2147483647'
  [host] OMP_MAX_TASK_PRIORITY='0'
  [host] OMP_NESTED='FALSE'
  [host] OMP_NUM_THREADS: value is not defined
  [host] OMP_PLACES: value is not defined
  [host] OMP_PROC_BIND='false'
  [host] OMP_SCHEDULE='static'
  [host] OMP_STACKSIZE='4M'
  [host] OMP_THREAD_LIMIT='2147483647'
  [host] OMP_TOOL='enabled'
  [host] OMP_TOOL_LIBRARIES: value is not defined
  [host] OMP_WAIT_POLICY='PASSIVE'
OPENMP DISPLAY ENVIRONMENT END