小编pep*_*uch的帖子

杰克逊反序列化器 - 将空集合更改为空集合

我有一个包含集合作为属性的实体:

public class Entity {

    @JsonProperty(value="homes")
    @JsonDeserialize(as=HashSet.class, contentAs=HomeImpl.class)
    private Collection<Home> homes = new ArrayList<Home>();

}
Run Code Online (Sandbox Code Playgroud)

如果request包含null作为请求属性:

{
  "homes": null
}
Run Code Online (Sandbox Code Playgroud)

那么homes被设置为null.我想要做的是将房屋设置为空列表.我需要为此编写特殊的反序列化器吗?还是有一个用于集合?我尝试的是这个反序列化器,但它看起来很丑陋(它不是通用的,而是使用实现而不是接口).

public class NotNullCollectionDeserializer extends JsonDeserializer<Collection<HomeImpl>> {

  @Override
  public Collection<HomeImpl> deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
    return jsonParser.readValueAs(new TypeReference<Collection<HomeImpl>>(){});
  }

  @Override
  public Collection<HomeImpl> getNullValue() {
    return Collections.emptyList();
  }
}
Run Code Online (Sandbox Code Playgroud)

这么几个问题:

  1. 是否有一些jackson属性在反序列化期间将null更改为空集合?
  2. 如果没有第一点 - 我需要为此编写反序列化器吗?如果是的话,我可以写一般的吗?

java json jackson

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

由于SYS_OP_C2C内部转换,Oracle SQL执行计划发生了变化

我想知道为什么这个查询的成本

select * from address a
left join name n on n.adress_id=a.id
where a.street='01';
Run Code Online (Sandbox Code Playgroud)

高于

select * from address a
left join name n on n.adress_id=a.id
where a.street=N'01';
Run Code Online (Sandbox Code Playgroud)

地址表看起来像这样

ID              NUMBER
STREET          VARCHAR2(255 CHAR)
POSTAL_CODE     VARCHAR2(255 CHAR)
Run Code Online (Sandbox Code Playgroud)

和名称表看起来像这样

ID              NUMBER
ADDRESS_ID      NUMBER
NAME            VARCHAR2(255 CHAR)
SURNAME         VARCHAR2(255 CHAR)
Run Code Online (Sandbox Code Playgroud)

这些是解释计划返回的成本

解释'01'的计划

-----------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                 | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                      |  3591 |  1595K|    87   (0)| 00:00:02 …
Run Code Online (Sandbox Code Playgroud)

sql oracle oracle11g

11
推荐指数
1
解决办法
4705
查看次数

如何使用具有多个类实现的CDI限定符?

我是Java EE/JSF的新手,现在阅读有关CDI限定符的内容 - 更改类实现的可能性.这很棒,但我有一个问题.据我所知,我可以使用限定符更改类实现,但我需要在使用此实现的任何地方更改它.在一个地方做这件事的最佳解决方案是什么?凭借我对Java EE的小知识,我发现了这一点.

让我们假设我们正在创建简单的Calculator应用程序.我们需要创建几个类:

  1. Calculator (计算器的基本实现)
  2. ScientificCalculator (科学实施计算器)
  3. MiniCalculator (潜力最小)
  4. MockCalculator (用于单元测试)
  5. 限定符@Calculator(将指示计算器的实际实现;我应该为每个实现创建限定符吗?)

这是个问题.我有四个计算器的实现,我想在少数地方使用其中一个,但只有一个在时间(在我将使用的初始项目阶段MiniCalculator,然后Calculator等等).如何在没有更改代码的情况下在注入对象的每个位置更改实现?我应该创建负责注射的工厂method injector吗?我的解决方案是正确有意义的吗

@ApplicationScoped
public class CalculatorFctory implements Serializable {
    private Calculator calc;

    @Produces @Calculator Calculator getCalculator() {
        return new Calculator();
    }
}
Run Code Online (Sandbox Code Playgroud)

使用计算器的类

public class CalculateUserAge {
    @Calculator
    @Inject
    private Calculator calc;
}
Run Code Online (Sandbox Code Playgroud)

这是正确的解决方案吗?如果我错了或者有更好的解决方案,请纠正我.谢谢!.

jsf dependency-injection java-ee cdi jsf-2

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

Gson.fromJson() - 如果Type不同则抛出异常

我已经创建了REST服务,ExceptionEntity如果出现问题,它会返回序列化的类.

如果应该反序列化的json Gson.fromJson()是不同的类型,我想抛出一些异常.例如,我有这个字符串应该反序列化(my.ExceptionEntity.class):

{"exceptionId":2,"message":"Room aaaa already exists."}
Run Code Online (Sandbox Code Playgroud)

但我使用Roomclass作为此序列化字符串的类型:

String json = "{\"exceptionId\":2,\"message\":\"Room aaaa already exists.\"}";
Room r = gson.fromJson(json, Room.class);
// as a result r==null but I want to throw Exception; how?
Run Code Online (Sandbox Code Playgroud)

[编辑] 我测试了这个,它不起作用:

try {
    return g.fromJson(roomJson, new TypeToken<Room>(){}.getType());
    // this also doesn't work
    // return g.fromJson(roomJson, Room.class);
} catch (JsonSyntaxException e) {
    pepuch.multiplayergame.entity.Exception ex = g.fromJson(roomJson, pepuch.multiplayergame.entity.Exception.class);
    throw ExceptionController.toGameServerException(ex);
} catch (JsonParseException e) {
    pepuch.multiplayergame.entity.Exception ex = g.fromJson(roomJson, pepuch.multiplayergame.entity.Exception.class);
    throw ExceptionController.toGameServerException(ex);
}
Run Code Online (Sandbox Code Playgroud)

java gson

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

将属性传递给自定义gradle任务

如何将属性传递给gradle自定义任务?在蚂蚁它看起来像这样:

public class MyCustomTask extends Task {

    private String name;
    private String version;

    @Override
    public void execute() throws BuildException {
        // do the job
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setVersion(String version) {
        this.version = version;
    }

}
Run Code Online (Sandbox Code Playgroud)

如何在gradle中完成?

class MyCustomTask extends DefaultTask {

    private String name
    private String version

    @TaskAction
    def build() {
        // do the job
    }

}
Run Code Online (Sandbox Code Playgroud)

属性名称和版本是必需的,用户需要将它们传递给任务.

groovy gradle

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

是否可以在OpenShift应用程序中更改主盒式磁带?

我在openshift上创建了Tomcat7应用程序,但现在我想将其更改为JBoss Application Server 7.是否可以在不重新创建应用程序的情况下删除(删除T7然后创建JB AS 7)?

openshift

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

黄瓜-jvm的自定义数据表变换器

我想在黄瓜中创建自定义数据表变换器.这是我的功能的样子:

Given board
| o | _ | _ |
| o | _ | _ |
| o | _ | _ |
Run Code Online (Sandbox Code Playgroud)

我想把它放到自定义对象中.让我们说它看起来像这样:

class Board {

    private List<List<String>> board;

    public Board(List<List<String>> board) {
        this.board = board;
    }

}
Run Code Online (Sandbox Code Playgroud)

我的步骤定义应如下所示:

@Given("^board$")
public void board(Board board) throws Throwable {
    // todo
}
Run Code Online (Sandbox Code Playgroud)

步骤定义适用于DataTable类和List<List<String>>

@Given("^board$")
public void board(DataTable board) throws Throwable {
    // this works fine
}
Run Code Online (Sandbox Code Playgroud)

这也很好

@Given("^board$")
public void board(List<List<String>> board) throws Throwable {
    // this …
Run Code Online (Sandbox Code Playgroud)

java cucumber cucumber-jvm

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

检查方法链中的最后一个getter是否为null

例如,在代码中,我们有很多链式方法obj.getA().getB().getC().getD().我想创建一个帮助类,它将检查方法getD()是否为null,但在此之前我需要检查所有以前的getter.我可以这样做:

try {
    obj.getA().getB().getC().getD();
}
catch (NullPointerException e) {
    // some getter is null
}
Run Code Online (Sandbox Code Playgroud)

或者(这是"愚蠢的")

if (obj!null && obj.getA()!=null && obj.getA().getB()!=null && ...) {
    obj.getA().getB().getC().getD();
}
else {
    // some getter is null
}
Run Code Online (Sandbox Code Playgroud)

我不想每次都try{} catch()在我的代码中使用它来检查它.为此目的,最佳解决方案是什么?

我认为最好的将是:

  1. obj.getA().getB().getC().getD().isNull()- 为此我需要更改所有的getter,例如实现一些包含isNull()方法的接口.
  2. NullObjectHelper.isNull(obj.getA().getB().getC().getD()); - 这将是最好的(我想是这样),但如何实现这一点?

java design-patterns

8
推荐指数
2
解决办法
3754
查看次数

Gradle本地依赖项不可见

在我的项目中,我使用了一些本地依赖项:

dependencies {
    compile files('lib/mylib.jar')
}
Run Code Online (Sandbox Code Playgroud)

为什么当我打电话时我gradle dependencies看不到这个库是一个依赖?命令gradle dependencies --configuration compile返回:

:dependencies

------------------------------------------------------------
Root project
------------------------------------------------------------

compile - Compile classpath for source set 'main'.
No dependencies
Run Code Online (Sandbox Code Playgroud)

从存储库(maven/ivy)下载的依赖项是可见的.例如:

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.google.guava:guava:14.0.1'
}
Run Code Online (Sandbox Code Playgroud)

将会呈现:

:dependencies

------------------------------------------------------------
Root project
------------------------------------------------------------

compile - Compile classpath for source set 'main'.
\--- com.google.guava:guava:14.0.1

BUILD SUCCESSFUL
Run Code Online (Sandbox Code Playgroud)

我还应该补充说,没有显示依赖项,但项目编译正确.

java gradle

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

使用apache-poi自动调整excel评论

我们有很多由apache poi生成的excel报告.其中一些包含标题中的注释.由于许多报告,我们希望创建用于添加注释的通用解决方案.我们注意到可以通过以下代码将注释添加到单元格中:

public static void addComment(final Workbook workbook, final Sheet sheet, final Cell cell, final Row row,
        final String comment) {

    final CreationHelper factory = workbook.getCreationHelper();

    final Drawing drawing = sheet.createDrawingPatriarch();

    final ClientAnchor anchor = factory.createClientAnchor();
    anchor.setCol1(cell.getColumnIndex());
    anchor.setCol2(cell.getColumnIndex() + 3);
    anchor.setRow1(row.getRowNum());
    anchor.setRow2(row.getRowNum() + 5);

    final Comment cellComment = drawing.createCellComment(anchor);
    final RichTextString richText = factory.createRichTextString(comment);
    cellComment.setString(richText);
    cell.setCellComment(cellComment);
}
Run Code Online (Sandbox Code Playgroud)

我们还注意到注释框大小可以使用列/行索引设置 - 这是我们的主要问题,因为如果第一列有100px而第二列有1000px,那么注释宽度将是1000px.这是我们的问题 - 是否有可能使用apache poi设置带像素的注释大小而不是列/行索引?或者也许有一些方法可以自动计算apache poi的评论大小?

apache-poi

6
推荐指数
1
解决办法
1080
查看次数