Может ли возвращаемое значение из метода присваиваться константе? - PullRequest
3 голосов
/ 10 февраля 2020

Я хочу отформатировать некоторые файлы в SpringBoot с одним запросом для каждого файла. При каждом запросе мне нужно вызывать метод getOutputFolder (dirName), чтобы получить выходной путь, чтобы сохранить файл в ожидаемом пути, но мое решение сопряжено с большими затратами. Я хочу определить одну константу, а затем, когда мне нужно вызвать функцию, я вместо этого вызываю это. Но я чувствую, что это кажется неправильным или, по крайней мере, хитрым способом сделать это. Есть ли лучший способ решить эту проблему?

private static final String OUTPUT_FOLDER_PATH = getOutputFolderPath();

private String getOutputFolder(String dirName) {
    String pathStr = getOutputFolderPath() + dirName + File.separator + "submit" + File.separator;
    Path outputDirPath = Paths.get(pathStr);

    Path path = null;
    boolean dirExists = Files.exists(outputDirPath);
    if (!dirExists) {
        try {
            path = Files.createDirectories(outputDirPath);
        } catch (IOException io) {
            logger.error("Error occur when create the folder at: {}", pathStr);
        }
    }
    return dirExists ? pathStr : Objects.requireNonNull(path).toString();
}

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Возможно, вы захотите взглянуть на jcache .

. Для этого вам необходимо установить его в свой проект Spring Boot

implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'javax.cache:cache-api:1.1.0'

// or the maven equivalent if you are using maven

Затем создать * Bean-компонент 1008 * для настройки кэша.

@Bean
public CacheManager cacheManager() {
  CachingProvider cachingProvider = Caching.getCachingProvider();
  CacheManager cacheManager = cachingProvider.getCacheManager();

  // The class arguments is <String, String> because the method to cache accepts a String and returns a String
  // just explore this object for the config you need.
  MutableConfiguration<String, String> configuration = new MutableConfiguration<>();

  String cacheName = "OUTPUT_FOLDER_CACHE";
  cacheManager.createCache(cacheName, configuration);
  return cacheManager;
}

Когда это настроено, теперь вы можете аннотировать метод для кэширования.

@Cacheable(
  cacheNames = { "OUTPUT_FOLDER_CACHE" }, // The same string in config
  unless = "#result == null" // Dont' cache null result; or do, if you need it.
)
String getOutputFolder(String dirName) {
  // method contents...
}

При правильной настройке: метод вернет кэшируйте значение, если оно существует, или запустите реальный метод, кэшируйте результат и возвращайте результат, если кэшированное значение не существует.

0 голосов
/ 10 февраля 2020

Вы можете решить эту проблему, используя ThreadLocal. Threadlocal может хранить значение, и вы можете сделать его полезным для себя. Предположим, что если ваш getOutputFolderPath () отличается для другого запроса, тогда вы можете сохранить значение getOutputFolderPath (), пока новый запрос отправляется на сервер, и вы можете выполнять все операции вплоть до текущего запроса.

См. Threadlocal Документы

@Service
public class FileSaveService {
    private static final ThreadLocal<String> path=new ThreadLocal<>();

    @PostConstruct
    public void init() {
        setPath(getOutputFolderPath());
    }

    public void setPath(String pathString) {
        path.set(pathString);
    }

    public String getPath() {
        if(path.get() == null) return getOutputFolderPath();
        return path.get();
    }

    @PreDestroy
    public void destroy() {
        path.remove();
    }

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