如果我正在开发一个相当简单的基于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) 我的[基本] 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) 我需要在SQL Server 2008 R2中的数据库表中添加两列:
我有几个问题:
createTS插入行时,只需设置一次.当我尝试datetime此列的类型并添加了默认值或绑定时getdate(),列值已适当设置.这是实现本专栏目的的最佳方式吗?我考虑过timestamp数据类型,但在我看来,这几乎是一个误称!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) 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 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) 我处理一个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) 我正在使用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) 我正在使用一个有点动态的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) 我正在使用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) 我想从命令输出的最后一位中解析出 3 条信息wget。例如:
2022-12-26 19:14:44 (13.7 Mb/s) - \xe2\x80\x98somelibrary.min.js\xe2\x80\x99 saved [1077022]\nRun Code Online (Sandbox Code Playgroud)\n我能够获取日期/时间,因为它是固定长度。我无法提取估计的传输速度 ( 13/7) 和文件大小 ( 1077022) 值。
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}\nRun Code Online (Sandbox Code Playgroud)\n我想剩余的子字符串提取需要借助正则表达式来完成,但我无法弄清楚。是否有一条仅使用 awk、sed 等 *nix 实用程序的可行路径?
\n我尝试过 awk:
\necho "(13.7 Mb/s)" | awk '$0 ~ /(.* Mb\\/s)/ {print $1}'\nRun Code Online (Sandbox Code Playgroud)\n但我得到的(13.7不仅仅是数字。
java ×4
angularjs ×2
docker ×2
html ×2
javascript ×2
spring-boot ×2
ajax ×1
apache-poi ×1
asynchronous ×1
awk ×1
bash ×1
dockerfile ×1
hyper-v ×1
java-stream ×1
jquery ×1
regex ×1
settimeout ×1
spring-mvc ×1
sql-server ×1
substring ×1
timestamp ×1
windows-10 ×1
xlsx ×1