小编Web*_*ser的帖子

基于Spring Boot控制台的应用程序如何工作?

如果我正在开发一个相当简单的基于Spring Boot控制台的应用程序,我不确定主执行代码的位置.我应该将它放在public static void main(String[] args)方法中,还是让主应用程序类实现CommandLineRunner接口并将代码放在run(String... args)方法中?

我将使用一个例子作为上下文.假设我有以下[基本]应用程序(编码为接口,Spring样式):

Application.java

public class Application {

  @Autowired
  private GreeterService greeterService;

  public static void main(String[] args) {
    // ******
    // *** Where do I place the following line of code
    // *** in a Spring Boot version of this application?
    // ******
    System.out.println(greeterService.greet(args));
  }
}
Run Code Online (Sandbox Code Playgroud)

GreeterService.java(界面)

public interface GreeterService {
  String greet(String[] tokens);
}
Run Code Online (Sandbox Code Playgroud)

GreeterServiceImpl.java(实现类)

@Service
public class GreeterServiceImpl implements GreeterService {
  public String …
Run Code Online (Sandbox Code Playgroud)

java console-application spring-boot

37
推荐指数
1
解决办法
4万
查看次数

控制器中的Spring Boot @Async方法同步执行

我的[基本] Spring Boot应用程序接受来自浏览器的请求,通过jQuery.get()并且应该立即收到响应 - 例如" 您的请求已排队 ".为此,我写了一个控制器:

@Controller
public class DoSomeWorkController {

  @Autowired
  private final DoWorkService workService;

  @RequestMapping("/doSomeWork")
  @ResponseBody
  public String doSomeWork() {

    workService.doWork(); // time consuming operation
    return "Your request has been queued.";
  }
}
Run Code Online (Sandbox Code Playgroud)

DoWorkServiceImpl类实现一个DoWorkService接口,是很简单的.它有一种方法来执行耗时的任务.我不需要从此服务调用返回任何内容,因为电子邮件将在工作结束时发送,包括失败或成功方案.所以它实际上看起来像:

@Service
public class DoWorkServiceImpl implements DoWorkService {

  @Async("workExecutor")
  @Override
  public void doWork() {

    try {
        Thread.sleep(10 * 1000);
        System.out.println("completed work, sent email");
    }
    catch (InterruptedException ie) {
        System.err.println(ie.getMessage());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我认为这样可行,但浏览器的Ajax请求在返回响应之前等待了10秒.所以控制器映射方法调用@Async同步注释的内部方法,看起来如此.在传统的Spring应用程序中,我通常会将其添加到XML配置中:

<task:annotation-driven />
<task:executor …
Run Code Online (Sandbox Code Playgroud)

java ajax asynchronous spring-mvc spring-boot

28
推荐指数
3
解决办法
5万
查看次数

SQL Server 2008行插入和更新时间戳

我需要在SQL Server 2008 R2中的数据库表中添加两列:

  • createTS - 插入行的日期和时间
  • updateTS - 更新行的日期和时间

我有几个问题:

  1. 我应该为每种类型使用哪种列数据类型?
  2. createTS插入行时,只需设置一次.当我尝试datetime此列的类型并添加了默认值或绑定getdate(),列值已适当设置.这是实现本专栏目的的最佳方式吗?我考虑过timestamp数据类型,但在我看来,这几乎是一个误称!
  3. updateTS需要设置更新行的日期和时间.在SQL Server中,没有ON UPDATE CURRENT_TIMESTAMP(如在MySQL中),所以看起来我不得不求助于使用触发器.这是正确的,我将如何做到这一点?

因此,对于想要回答这个问题的人来说,有一个起点,这里是创建表脚本:

CREATE TABLE [dbo].[names]
(
    [name] [nvarchar](64) NOT NULL,
    [createTS] [datetime] NOT NULL CONSTRAINT [DF_names_createTS]  DEFAULT (getdate()),
    [updateTS] [datetime] NOT NULL,
    CONSTRAINT [PK_names] PRIMARY KEY CLUSTERED 
    (
        [name] ASC
    )
    WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON …
Run Code Online (Sandbox Code Playgroud)

sql-server timestamp

22
推荐指数
1
解决办法
10万
查看次数

如何在Dockerfile中为ENTRYPOINT指定工作目录

Docker镜像(基于Windows)包含一个应用程序目录C:\App.在该目录中包含多个子文件夹和文件,包括一个名为的批处理文件process.bat.Dockerfile(用于构建图像)如下所示:

ENTRYPOINT [ "C:\\App\\process.bat" ]
Run Code Online (Sandbox Code Playgroud)

当我使用以下命令实例化此映像时docker run company/app,批处理文件会运行,但在C:\App引用其他文件的位置会失败.实质上,工作目录仍然C:\来自Docker容器的入口点.

有没有办法在Dockerfile中设置工作目录?确实存在几种替代方案:

  • 添加-w C:\App到docker运行
  • 在批处理文件中,我可以在开头添加一行 cd /D C:\App

但有没有办法在Dockerfile中指定工作目录?

docker dockerfile

14
推荐指数
2
解决办法
3万
查看次数

无法在Windows 10上复制到Windows容器('docker cp')

我在笔记本电脑上设置了Docker for Windows,并在Docker的设置中从Linux容器切换到Windows容器(这促使了几次重启和Windows更新).我拉了一个图像并使用命令运行基于它的容器:

docker pull microsoft/dotnet-framework
docker run -it microsoft/dotnet-framework cmd
Run Code Online (Sandbox Code Playgroud)

在第二个终端窗口中,我执行了命令:

docker cp app container_id:/
Run Code Online (Sandbox Code Playgroud)

并收到此错误消息:

来自守护程序的错误响应:不支持针对正在运行的Hyper-V容器的文件系统操作

我搜索了这个错误,但没有任何(解释性的)出现,非常令人惊讶.有没有办法在Windows 10上将图像作为Windows容器而不是Hyper-V容器运行?

最终,我将此容器部署到Windows Server 2016主机,但我需要在运行Windows 10 Pro的笔记本电脑上进行所有开发和测试.

Docker版本

Client:
 Version:      17.06.0-ce
 API version:  1.30
 Go version:   go1.8.3
 Git commit:   02c1d87
 Built:        Fri Jun 23 21:30:30 2017
 OS/Arch:      windows/amd64

Server:
 Version:      17.06.0-ce
 API version:  1.30 (minimum version 1.24)
 Go version:   go1.8.3
 Git commit:   02c1d87
 Built:        Fri Jun 23 22:19:00 2017
 OS/Arch:      windows/amd64
 Experimental: true
Run Code Online (Sandbox Code Playgroud)

hyper-v docker windows-10 windows-container

12
推荐指数
1
解决办法
5805
查看次数

使用Java 8流来转换具有空值的Map

我处理一个Map<String,String>具有null中键和/或值项:

Map<String, String> headers = new HashMap<>();
headers.put("SomE", "GreETing");
headers.put("HELLO", null);
headers.put(null, "WOrLd");

headers.keySet().stream().forEach(k -> System.out.println(k + " => " + copy.get(k)));
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

SomE => GreETing
HELLO => null
null => WOrLd
Run Code Online (Sandbox Code Playgroud)

我需要转换地图,所以所有非空值都转换为小写,如下所示:

some => greeting
hello => null
null => world
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用Java 8流API,但以下代码抛出NullPointerException:

Map<String,String> copy
    = headers.entrySet()
             .stream()
             .collect(
                 Collectors.toMap(
                     it -> it.getKey() != null ? it.getKey().toLowerCase() : null,
                     it -> it.getValue() != null ? it.getValue().toLowerCase() : null));

copy.keySet().stream().forEach(k -> System.out.println(k + " …
Run Code Online (Sandbox Code Playgroud)

java java-stream

10
推荐指数
2
解决办法
9769
查看次数

AngularJS输入字段未从控制器内的setTimeout更新

我正在使用AngularJS驱动的页面,我需要在只读输入文本字段中显示一个运行时钟(双向绑定data-ng-model).为了模拟运行时钟,我使用JavaScript调度程序setTimeout每1000次调用一个函数毫秒,它更新$ scope'd属性值,后者又绑定到输入文本字段.输入字段中的值不会更新.所以我放置了一个<pre />标签并使用jQuery选择器更新了它的内容.这是工作正常,所以我需要帮助获取输入文本字段值也每秒更新.

我为这个例子设置了一个jsFiddle.

HTML如下:

<body data-ng-app="formApp">
    <div data-ng-controller="FormCtrl">
        Current Date and Time <input type="text" data-ng-model="formData.currentDateTime" readonly="readonly" size="60" />
    </div>
    <pre id="currentDateTime" style="font-size:1.5em;">
    </pre>
</body>
Run Code Online (Sandbox Code Playgroud)

AngularJS app模块和控制器声明如下:

(function() {
    var formApp = angular.module("formApp", []);

    formApp.controller("FormCtrl", function ($scope) {
        $scope.formData = {};
        $scope.formData.currentDateTime = new Date().toString();

        (function updateCDT() {
            $scope.formData.currentDateTime = new Date().toString();
            document.getElementById("currentDateTime").innerHTML = $scope.formData.currentDateTime;
            setTimeout(updateCDT, 1000);
        })();
    });
})();
Run Code Online (Sandbox Code Playgroud)

html javascript jquery settimeout angularjs

8
推荐指数
1
解决办法
2678
查看次数

AngularJS形式和null /空值

我正在使用一个有点动态的AngularJS表单.换句话说,我能够添加输入字段等行.所以我的方法是从一个$scope.formData空对象开始,封装绑定到静态和动态HTML表单元素的所有属性.

AngularJS代码如下:

(function() {
    var formApp = angular.module("formApp", []);
    formApp.controller("FormCtrl", function ($scope, $timeout) {
        $scope.formData = {};
        $scope.formData.subscribers = [
            { name: null, email: null }
        ];
        $scope.addSubscriber = function() {
            $scope.formData.subscribers.push({ name: null, email: null });
        };
    });
})();
Run Code Online (Sandbox Code Playgroud)

AngularJS表单的HTML:

<body data-ng-app="formApp">
    <div data-ng-controller="FormCtrl">
        <p>
            Name of Topic: <input type="text" data-ng-model="formData.title" placeholder="enter a title" />
        </p>
        Subscribers:
        <button data-ng-click="addSubscriber()">Add subscriber</button>
        <table>
            <tr>
                <th>Name</th>
                <th>Email</th>
            </tr>
            <tr data-ng-repeat="subscriber in formData.subscribers">
                <td><input type="text" data-ng-model="subscriber.name" placeholder="enter name" /></td>
                <td><input type="text" …
Run Code Online (Sandbox Code Playgroud)

html javascript angularjs angularjs-scope

8
推荐指数
1
解决办法
3万
查看次数

使用Apache POI读取Excel .XLSX时出错

我正在使用Apache POI 3.8库来读取Web应用程序中的XLSX文件.以下代码在Java控制台应用程序中运行良好:

InputStream inputFS = new FileInputStream("test.xlsx");
Workbook workbook = new XSSFWorkbook(inputFS); // below exception is thrown on this line
Sheet sheet = workbook.getSheetAt(0);
Run Code Online (Sandbox Code Playgroud)

但在Web应用程序中使用时会抛出"读取错误".下面粘贴了堆栈跟踪的相关摘录:

java.io.IOException: Read error
at java.io.FileInputStream.readBytes(Native Method) ~[na:1.6.0_31]
at java.io.FileInputStream.read(Unknown Source) ~[na:1.6.0_31]
at java.io.FilterInputStream.read(Unknown Source) ~[na:1.6.0_31]
at java.io.PushbackInputStream.read(Unknown Source) ~[na:1.6.0_31]
at java.util.zip.ZipInputStream.readFully(Unknown Source) ~[na:1.6.0_31]
at java.util.zip.ZipInputStream.readLOC(Unknown Source) ~[na:1.6.0_31]
at java.util.zip.ZipInputStream.getNextEntry(Unknown Source) ~[na:1.6.0_31]
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:51) ~[poi-ooxml-3.8-20120326.jar:3.8]
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:83) ~[poi-ooxml-3.8-20120326.jar:3.8]
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:228) ~[poi-ooxml-3.8-20120326.jar:3.8]
at org.apache.poi.util.PackageHelper.open(PackageHelper.java:39) ~[poi-ooxml-3.8-20120326.jar:3.8]
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:187) ~[poi-ooxml-3.8-20120326.jar:3.8]
at com.corp.ReportManager.parseExcelReport(ReportManager.java:575) [ReportManager.class:na]
Run Code Online (Sandbox Code Playgroud)

以下JAR包含在类路径中(按相同顺序):

poi-3.8-20120326.jar
poi-ooxml-3.8-20120326.jar
poi-ooxml-schemas-3.8-20120326.jar
xbean.jar …
Run Code Online (Sandbox Code Playgroud)

java xlsx apache-poi

7
推荐指数
1
解决办法
4万
查看次数

从固定模式字符串中提取多个值

我想从命令输出的最后一位中解析出 3 条信息wget。例如:

\n
2022-12-26 19:14:44 (13.7 Mb/s) - \xe2\x80\x98somelibrary.min.js\xe2\x80\x99 saved [1077022]\n
Run Code Online (Sandbox Code Playgroud)\n

我能够获取日期/时间,因为它是固定长度。我无法提取估计的传输速度 ( 13/7) 和文件大小 ( 1077022) 值。

\n
STR="2022-12-26 19:14:44 (13.7 Mb/s) - \xe2\x80\x98somelibrary.min.js\xe2\x80\x99 saved [1077022]"\necho date/time is ${STR::19}\n
Run Code Online (Sandbox Code Playgroud)\n

我想剩余的子字符串提取需要借助正则表达式来完成,但我无法弄清楚。是否有一条仅使用 awk、sed 等 *nix 实用程序的可行路径?

\n

我尝试过 awk:

\n
echo "(13.7 Mb/s)" | awk '$0 ~ /(.* Mb\\/s)/ {print $1}'\n
Run Code Online (Sandbox Code Playgroud)\n

但我得到的(13.7不仅仅是数字。

\n

regex bash awk substring

7
推荐指数
4
解决办法
194
查看次数