我使用spring boot来开发用于发送电子邮件的shell项目,例如
sendmail -from foo@bar.com -password foobar -subject "hello world" -to aaa@bbb.com
Run Code Online (Sandbox Code Playgroud)
如果缺少from
和password
参数,我使用默认的发件人和密码,例如noreply@bar.com
和123456
.
因此,如果用户传递from
参数,他们也必须传递password
参数,反之亦然.也就是说,两者都是非null,或者两者都是null.
我该如何优雅地检查?
现在我的方式是
if ((from != null && password == null) || (from == null && password != null)) {
throw new RuntimeException("from and password either both exist or both not exist");
}
Run Code Online (Sandbox Code Playgroud) 我在我的项目中使用了龙目岛,但我的同事不同意使用它,他的理由是(来自lombok文件的争议)
这两个项目Lombok都利用非公共API来完成他们的巫术.这意味着使用后续IDE或JDK版本可能会破坏Project Lombok的风险.
但这是一篇2010年写的非常古老的文档,也许现在已经解决了这个问题,所以我想知道Lombok是否支持Java 9并且它仍然使用非公共API:s?
Spring Boot Maven和Gradle插件现在可以为Linux/Unix操作系统生成完整的可执行存档.运行完全可执行的JAR就像输入一样简单:
$ ./myapp.jar
Run Code Online (Sandbox Code Playgroud)
我的问题是在这种情况下如何设置-D属性,例如
-Dspring.profiles.active=test
Run Code Online (Sandbox Code Playgroud)
另外,如果服务器没有安装jdk,这个完全可执行的jar仍然可以运行吗?
我有一个商品对象,它有两个属性:firstCategoryId
和secondCategoryId
.我有一个商品清单,我想获得所有类别ID(包括firstCategoryId和secondCategoryId).
我目前的解决方案是:
List<Integer> categoryIdList = goodsList.stream().map(g->g.getFirstCategoryId()).collect(toList());
categoryIdList.addAll(goodsList.stream().map(g->g.getSecondCategoryId()).collect(toList()));
Run Code Online (Sandbox Code Playgroud)
有没有更方便的方式我可以在一个语句中获得所有categoryIds?
Spring启动非Web应用程序,启动时有以下错误
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:185) ~[spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
Run Code Online (Sandbox Code Playgroud)
然后我尝试了下面的方式
new SpringApplication().setWebEnvironment(false);
Run Code Online (Sandbox Code Playgroud)
然后开始它仍然有上面的错误.
然后试过
@SpringBootApplication(exclude={SpringDataWebAutoConfiguration.class})
Run Code Online (Sandbox Code Playgroud)
但仍然有同样的错误.
最后我尝试添加以下配置 application.properties
spring.main.web-environment=false
Run Code Online (Sandbox Code Playgroud)
这次它有效.
为什么前两种方式不起作用?
spring boot项目,构建为可执行jar,但我发现无法提取可执行jar,例如
jar xvf spring-boot-foo-0.0.1-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)
没什么输出.但是当提取一个普通的罐子时,它是成功的
jar xvf mysql-connector-java-5.1.38.jar
created: META-INF/
inflated: META-INF/MANIFEST.MF
created: META-INF/services/
...
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
因为我们使用远程Mysql
服务器开发,所以不能轻易检查查询sql,如果使用本地服务器你可以tail - f general_log_file
在调用一些http接口时查看执行哪些sql.所以我安装了一个wireshark
来捕获这些查询从本地发送的sql.起初我使用本地mysql来验证它.
然后我在mysql终端中执行了两个查询sql
select version();
select now();
Run Code Online (Sandbox Code Playgroud)
但非常令人失望我在wireshark中找不到这两个sql包
我只发现了这四个包.
但是从我知道的帖子中
要过滤掉mysql数据包,只需使用过滤器'mysql'或'mysql.query!=""',只需要请求查询的数据包.之后,您可以添加一个字段名称为"mysql.query"的自定义列,以获取执行位置的查询列表.
效果是这样的
只捕获查询sql很方便,并且非常清楚地显示了这些查询sql.那我怎么
wireshark
用来实现呢?
你好@Jeff S.
我试过你的命令,请看下面
#terminal 1
tshark -i lo0 -Y "mysql.command==3"
Capturing on 'Loopback'
# terminal 2
mysql -h127.0.0.1 -u root -p
select version();
#result: nothing output in terminal 1
Run Code Online (Sandbox Code Playgroud)
和tshark -i lo0 -Y "mysql.command==3" -T fields -e mysql.query
一样的是tshark -i lo -Y "mysql.command==3"
也没什么输出.但如果我只使用tshark -i lo0
它,它有输出
Capturing on 'Loopback'
1 0.000000 127.0.0.1 …
Run Code Online (Sandbox Code Playgroud) 在阅读了源代码之后java.util.HashMap#resize
,我对某些部分非常困惑 - 也就是当某些bin
节点有多个节点时.
else { // preserve order
Node<K,V> loHead = null, loTail = null;
Node<K,V> hiHead = null, hiTail = null;
Node<K,V> next;
do {
next = e.next;
if ((e.hash & oldCap) == 0) {
if (loTail == null)
loHead = e;
else
loTail.next = e;
loTail = e;
}
else {
if (hiTail == null)
hiHead = e;
else
hiTail.next = e;
hiTail = e;
}
} while ((e = next) != …
Run Code Online (Sandbox Code Playgroud) 我遇到了一个非常奇怪的异常,我不知道如何找到原因.
商业背景:添加商品并同时列出价格表,商品有差价水平用户的5个价格.
在控制器中,首先使用dozer将goodForm转换为商品,然后调用goodsService来保存商品.在货物服务保存货物后,遍历货物价格表并填充货物ID到货物价格,
GoodsForm:
@Mapping("priceList")
List<GoodsPriceForm> goodsPriceFormList;
Goods:
List<GoodsPrice> priceList;
Controller:
Goods goods = BeanMapper.map(goodsForm, Goods.class);
goodsService.saveGoods(adminId, goods);
GoodsService:
goodsDao.save(goods);
goods.getPriceList().forEach(p -> p.setGoodsId(goods.getId()));
goodsPriceDao.save(goods.getPriceList());
Run Code Online (Sandbox Code Playgroud)
但它抛出异常:
2015-11-27 17:10:57,042 [http-nio-8081-exec-8] ERROR o.a.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: com.foo.goods.model.GoodsPrice cannot be cast to com.foo.goods.model.GoodsPrice] with root cause
java.lang.ClassCastException: com.foo.goods.model.GoodsPrice cannot be cast to com.foo.goods.model.GoodsPrice
at com.foo.goods.service.GoodsService$$Lambda$11/310447431.accept(Unknown Source) ~[na:na]
at java.util.ArrayList.forEach(ArrayList.java:1249) ~[na:1.8.0_51]
at com.foo.goods.service.GoodsService.saveGoods(GoodsService.java:34) ~[classes/:na]
Run Code Online (Sandbox Code Playgroud)
这个错误信息让我感到很困惑.另外我写一个单元测试想重复这个,但失败了.
GoodsForm form = new …
Run Code Online (Sandbox Code Playgroud) 如何使用Spring Data Jpa实现批量更新?我有商品实体,对于差异用户等级,有差价,例如
goodsId level price
1 1 10
1 2 9
1 3 8
Run Code Online (Sandbox Code Playgroud)
更新商品时我想批量更新这些价格,如下所示:
@Query(value = "update GoodsPrice set price = :price where goodsId=:goodsId and level=:level")
void batchUpdate(List<GoodsPrice> goodsPriceList);
Run Code Online (Sandbox Code Playgroud)
但它抛出异常,
Caused by: java.lang.IllegalArgumentException: Name for parameter binding must not be null or empty! For named parameters you need to use @Param for query method parameters on Java versions < 8.
Run Code Online (Sandbox Code Playgroud)
那么如何正确使用Spring数据Jpa实现批量更新呢?