Есть много методов @Service, чтобы проверить, имеет ли идентификатор какой-либо результат - PullRequest
0 голосов
/ 16 октября 2018
if (!WebUtils.isEmpty(appAppService.getByAppid(id))) {
        LOGGER.info(":bind app info");
        errorNum++;
    }
    if (!WebUtils.isEmpty(appDownloadCensusService.getByAppid(id))) {
        LOGGER.info(":bind bi info");
        errorNum++;
    }
    if (!WebUtils.isEmpty(appManuCensusService.getByAppid(id))) {
        LOGGER.info(":bind download info");
        errorNum++;
    }
    if (!WebUtils.isEmpty(appOrderService.getByAppid(id))) {
        LOGGER.info(":bind order info");
        errorNum++;
    }
    if (!WebUtils.isEmpty(appShareService.getByAppid(id))) {
        LOGGER.info(":bind share info");
        errorNum++;
    }
    ......

эти xxxService являются свойствами @Autowired, а "...." представляет другие подобные операторы if. Как можно избежать этого путем рефакторинга кода? Я пытался использовать отражение, чтобы получить xxxService, но обнаружил, чтокласс xxxService может быть создан, но свойства в них, например, xxxxDao, SessionFactory (я использовал Hibernate), не могут быть созданы отражением, как я могу это сделать? Или если есть какой-либо другой способ решить проблему проверки if?

То, что я действительно хочу, - это как реорганизовать код, чтобы он выглядел более привлекательно: как можно избежать такого количества операторов if?

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Попытка другого подхода.Причина, по которой вы можете создавать экземпляры классов, но не можете иметь свойства, заключается в том, что вам нужно получить экземпляры из контекста Spring, где они все инициализированы.

Для этого у вас должен быть доступ к ApplicationContext.Например, реализуя интерфейс ApplicationContextAware.

@Component
public class Example implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    public void verify(int id) {
      MyAppService appService = (MyAppService)  applicationContext.getAutowireCapableBeanFactory().getBean("serviceName");
    } 

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

Таким образом, вы достигнете того, что искали, с помощью методов отражения в вашем вопросе.

0 голосов
/ 16 октября 2018

Хорошо, давайте, если это то, что вы ищете.Затем вам придется использовать рефлексию.

Объединяя ответ с контекстом приложения, он будет выглядеть так:

private static final List<String> serviceClassNames = Arrays.asList(
    “appAppService”, “censusAppService”, ...)

public void verify() {
    serviceClassNames.forEach(className -> {
        Object service = applicationContext.getAutowireCapableFactory().getBean(className);

    Object app = Arrays.stream(service.getClass().getDeclaredMethods())
    .filter(method -> method.getName.equals(“getAppById”))
    .findFirst()
    .orElseThrow(() -> new RuntimeException(“Method not found!”)
    .invoke(id)

    If (!WebUtils.isEmpty(app)) {
        LOGGER.info......
    }
}

Это то, что вам нужно?

0 голосов
/ 16 октября 2018

Учитывая, что все ваши классы имеют одинаковый интерфейс, как и должно быть, вы можете внедрить все его реализации в List <>.Допустим, имя интерфейса - AppService.

@Component 
public class Example {

    private final List<AppService> appServices;

    public Example(List<AppService> appServices) {
        this.appServices = appServices;
    }

    public void verifyLogs(int id) {
        appServices.forEach(appService -> {
                if (!WebUtils.isEmpty(appService.getAppById(id))) {
                    LOGGER.info(":bind order info");
                    errorNum++;
                }
            }
        );
    }

Интерфейс будет выглядеть примерно так:

public interface AppService {
     App getAppById(int id);
}

И службы:

@Service
public class AppAppService implements AppService {
    public App getAppById(int id) {
        // logic to get the app by id
   }
}

Надеюсь, это поможет!

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