小编zhu*_*wei的帖子

检查Java中的两个参数,要么都不为null,要么优雅为null

我使用spring boot来开发用于发送电子邮件的shell项目,例如

sendmail -from foo@bar.com -password  foobar -subject "hello world"  -to aaa@bbb.com
Run Code Online (Sandbox Code Playgroud)

如果缺少frompassword参数,我使用默认的发件人和密码,例如noreply@bar.com123456.

因此,如果用户传递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)

java

156
推荐指数
12
解决办法
3万
查看次数

Lombok项目是否支持Java 9?

我在我的项目中使用了龙目岛,但我的同事不同意使用它,他的理由是(来自lombok文件的争议)

这两个项目Lombok都利用非公共API来完成他们的巫术.这意味着使用后续IDE或JDK版本可能会破坏Project Lombok的风险.

但这是一篇2010年写的非常古老的文档,也许现在已经解决了这个问题,所以我想知道Lombok是否支持Java 9并且它仍然使用非公共API:s?

lombok java-9

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

Spring启动运行完全可执行的JAR并指定-D属性

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仍然可以运行吗?

spring-boot

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

如何将对象的两个字段收集到同一个列表中?

我有一个商品对象,它有两个属性:firstCategoryIdsecondCategoryId.我有一个商品清单,我想获得所有类别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?

java lambda java-8

13
推荐指数
1
解决办法
3736
查看次数

关于spring boot如何正确禁用web环境

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

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

为什么无法提取spring boot可执行jar

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)

为什么是这样?

jar spring-boot

9
推荐指数
3
解决办法
6077
查看次数

如何使用wireshark清楚地捕获mysql查询sql

因为我们使用远程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)

mysql wireshark tshark

9
推荐指数
1
解决办法
2万
查看次数

混淆hashmap#resize

在阅读了源代码之后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)

java hashmap

9
推荐指数
1
解决办法
231
查看次数

与Spring引导devtools相关的推土机映射异常

我遇到了一个非常奇怪的异常,我不知道如何找到原因.

商业背景:添加商品并同时列出价格表,商品有差价水平用户的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)

java classloader dozer spring-boot

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

如何使用Spring Data Jpa实现批量更新?

如何使用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实现批量更新呢?

spring-data-jpa

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