基于命令行争论自动装配bean

时间:2017-09-04 19:47:17

标签: java spring spring-boot

我是Spring框架的新手。使用它在lombok库的帮助下开发java命令行程序。

我正在尝试根据通过命令行参数传递的值来创建我的bean,此时此命令失败。

使用args:java -jar TestProject.jar -Dfield="TEMP"

通过命令行运行应用程序

任何建议都会有所帮助。谢谢。

主要课程

public class TestApp implements CommandLineRunner {

@Autowired
private DataService dataService;

/**
 *
 * @param args
 * @throws FileNotFoundException
 * @throws IOException
 */
public static void main(String[] args) throws FileNotFoundException, IOException {

    SpringApplication.run(TestApp.class, args);
    System.out.println("STOPPING ******");
}

@Override
public void run(String... arg0) throws Exception {

    this.dataService.processFile();
 }
}

DataService类(工作正常)

@Component
public class DataServiceImpl implements DataService {


@Autowired(required = false)
private Processor processor;

/**
 * Processes file and returns results
 *
 * @throws java.io.FileNotFoundException
 * @throws java.io.IOException
 */
@Override
public void processFile() throws FileNotFoundException, IOException {

    if (processor != null) {
        System.out.println(this.processor.getClass());
        List<Long> values = processor.roundUp();

        String strDisplay = "";
        for (int i = 0; i < values.size() - 1; i++) {
            if (StringUtils.isEmpty(strDisplay)) {
                strDisplay = "" + values.get(i);
            } else {
                strDisplay = strDisplay + "," + values.get(i);
            }
        }

        if (!StringUtils.isEmpty(strDisplay)) {
            System.out.println(strDisplay);
        } else {
            System.out.println("Testing");
        }
    }
 } 

}

处理器(抽象类)

public abstract class Processor {

@Autowired
public FileParser fileParser;

public abstract List<String> process();

public List<Long> roundUp() {
    List<String> valueList = process();
    List<Long> valueListDouble = new ArrayList<>();
    if (valueList != null) {
        for (String value : valueList) {
            valueListDouble.add(Math.round(Double.parseDouble(value)));
        }
    }
    return valueListDouble;

  }
 }

TempProcessorImpl类,基于命令行参数

创建
@Component
@ConditionalOnExpression("#{systemProperties['field']!=null && systemProperties['field'].equals('TEMP')}")
public class TempProcessorImpl extends Processor {

@Override
public List<String> process() {
    return fileParser.getColumnValuesForHeaderFromFile();
  } 
}

1 个答案:

答案 0 :(得分:0)

如果要从FileSystemResource(即从命令行参数)获取文件的路径,可以使用external location和ConfigurationProperties。这是创建配置类的好方法:

@Component
@ConfigurationProperties
public class AppConfig {

  private FileSystemResource file;

  public FileSystemResource getFile() {
    return file;
  }

  public void setFile(FileSystemResource file) {
    this.file = file;
  }
}

然后将其注入TempProcessorImpl类。然后你可以运行Spring应用程序:

java -jar -Dfile=/Users/some/file.txt yourapp.jar

P.S。您可以使用String或其他数据类型而不是FileSystemResource,取决于此任务的更好。