Java 在Spring Boot应用程序@RestController中,哪种获取信息的模式更好?如何指定任何@Mapping?
我在Spring Boot应用程序中有@RestControllerJava 在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
@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替代原理呢?这是我在上一个大项目中学到的东西。继承是不应该再使用的。您可以在组合中做任何事情,从而使您的项目更具可维护性单一责任原则