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

Java 在Spring Boot应用程序@RestController中,哪种获取信息的模式更好?如何指定任何@Mapping?,java,spring,rest,spring-boot,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

我在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,在其中我收到了
另一个实体
。这种架构风格允许我在服务层中创建通用层次结构

问题1:这不是一个坏模式吗?这和完美的休息服务一样好还是我应该避免? 问题2:在这种情况下,我不使用@PathVariable,只需要将someWord/SomeOtherWord指定为@PutMapping路径。有没有什么方法可以在没有intellij检查的情况下指定像any/any这样的东西,我应该使用它

更新:架构的一个例子

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);
    }
}
公共抽象类验证程序{
公开摘要无效验证(T);
}
公共类FirstEntityValidator扩展验证程序{
公共无效验证(第一实体){
...
}
}
公共类SecondEntityValidator扩展了验证器{
公共无效验证(第二个实体){
...
}
}
公共抽象类EntityService{
私人验证器;
公共实体服务(验证器验证器){
this.validator=验证程序;
}
}
公共类FirstEntityService扩展了EntityService{
公共FirstEntityService(FirstEntityValidator验证程序){
超级(验证器);
}
}
公共类SecondEntityService扩展了EntityService{
公共SecondEntityService(SecondEntityValidator验证程序){
超级(验证器);
}
}

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

我认为您试图做的是将您的存储库公开为REST Web服务。 Spring可以为您处理此问题。 看看这个:

使用接口。 不要使用任何抽象类。 这是不必要的,在较大的项目中可能很难处理

这样会更好:

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

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


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

public interface EntityService{

 //your methods....

}

public class FirstEntityService implements EntityService{

    private FirstEntityValidator validator;

    public FirstEntityService(FirstEntityValidator validator){
        this.validator = validator;
    }

}
公共接口类验证程序{
无效验证(T);
}
公共类FirstEntityValidator实现验证器{
公共无效验证(第一实体){
....
}
}
公共类SecondEntityValidator实现验证器{
公共无效验证(第二个实体){
....
}
}
公共接口实体服务{
//你的方法。。。。
}
公共类FirstEntityService实现EntityService{
私有FirstEntityValidator验证程序;
公共FirstEntityService(FirstEntityValidator验证程序){
this.validator=验证程序;
}
}

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

我认为您试图做的是将您的存储库公开为REST Web服务。 Spring可以为您处理此问题。 看看这个:

使用接口。 不要使用任何抽象类。 这是不必要的,在较大的项目中可能很难处理

这样会更好:

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

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


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

public interface EntityService{

 //your methods....

}

public class FirstEntityService implements EntityService{

    private FirstEntityValidator validator;

    public FirstEntityService(FirstEntityValidator validator){
        this.validator = validator;
    }

}
公共接口类验证程序{
无效验证(T);
}
公共类FirstEntityValidator实现验证器{
公共无效验证(第一实体){
....
}
}
公共类SecondEntityValidator实现验证器{
公共无效验证(第二个实体){
....
}
}
公共接口实体服务{
//你的方法。。。。
}
公共类FirstEntityService实现EntityService{
私有FirstEntityValidator验证程序;
公共FirstEntityService(FirstEntityValidator验证程序){
this.validator=验证程序;
}
}

还有一个问题-来自@RequestBody和@PathVariable的信息可能不同。您提到了可能的更改,但如果我有两个用于两个不同实体的服务(服务是抽象的,它可以是分布式服务、缓存服务等),它们有相同的方法吗?区别是唯一的单参数类型。一方面,我有复制粘贴。另一方面,如果使用T类型的AbstractService,将来可能会出现问题。看起来这两个选项都不太好,不要使用抽象服务。使用构图。这将对你的未来有很大帮助。读这篇文章:但是关于Liskov替代原理呢?这是我在上一个大项目中学到的东西。继承是不应该再使用的。你可以在组合中做任何事情,使你的项目更具可维护性单一责任原则我认为这是开发人员在过去10年里学到的。继承可能很有用。但在几乎所有情况下,组合都是更好的选择这里还有一个问题,@RequestBody和@PathVariable的信息可能不同。您提到了可能的更改,但如果我有两个用于两个不同实体的服务(服务是抽象的,它可以是分布式服务、缓存服务等),它们有相同的方法吗?区别是唯一的单参数类型。一方面,我有复制粘贴。另一方面,如果使用T类型的AbstractService,将来可能会出现问题。看起来这两个选项都不太好,不要使用抽象服务。使用构图。这将对你的未来有很大帮助。读这篇文章:但是关于Liskov替代原理呢?这是我在上一个大项目中学到的东西。继承是不应该再使用的。您可以在组合中做任何事情,从而使您的项目更具可维护性单一责任原则