Какой шаблон получения информации в Spring Boot Application @RestController лучше и как указать ЛЮБОЙ @Mapping? - PullRequest
0 голосов
/ 10 марта 2019

У меня есть @ RestController в Spring Boot Application.

@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 путь . Есть ли способ указать что-то вроде любой / любой без проверки, что я должен использовать это?

Обновление: пример архитектуры

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 Ответ

2 голосов
/ 10 марта 2019

Я бы избежал чего-то подобного. Вы должны отделить свои контроллеры REST так же, как вы разделяете свои сервисы. В случае, если вам нужно что-то изменить только для одной сущности, вам все равно придется все реорганизовать или создать некрасивый код.

Я думаю, что вы пытаетесь выставить свои репозитории как веб-сервис REST. Весна может с этим справиться. Проверь это: https://docs.spring.io/spring-data/rest/docs/current/reference/html/

Использовать интерфейсы. Не используйте абстрактные классы. Это не является необходимым и может быть очень сложным в больших проектах

Это было бы лучше:

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;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...