我正在尝试使用Spring的RestTemplate自动反序列化XML格式的响应.我正在使用Jackson的jackson-dataformat-xml模块,Spring Boot设置为自动配置.我想在我要反序列化的类中使用JAXB注释,但它似乎不起作用.以下是我希望该类看起来像的示例:
@XmlRootElement(name="Book")
public class Book {
@XmlElement(name="Title")
private String title;
@XmlElement(name="Author")
private String author;
}
Run Code Online (Sandbox Code Playgroud)
这基于以下XML示例:
<Book>
<Title>My Book</Title>
<Author>Me</Author>
</Book>
Run Code Online (Sandbox Code Playgroud)
但是,如上所述注释类,则始终设置字段null.我做了一些实验,发现如果我用Jackson's @JsonProperty注释子元素,反序列化就有效:
@XmlRootElement(name="Book")
public class Book {
@JsonProperty("Title")
private String title;
@JsonProperty("Author")
private String author;
}
Run Code Online (Sandbox Code Playgroud)
它有效,但不知怎的,我觉得它有点尴尬.有没有办法让JAXB注释像我的第一个例子一样工作?
Jackson为jackson-module-jaxb-annotationsXML数据绑定提供了模块,以便与JAXB注释一起使用.但是,我不知道该如何设置ObjectMapper正由RestTemplate使用该模块.
在使用 mocks 进行单元测试时,我经常遇到需要检查是否使用适当的参数调用了 mock 的某个方法。这意味着我必须以某种方式找到一种方法来查看传递给相关方法的内容。在 Spock 中,这可以使用以下方法完成:
1 * serviceMock.operate(*_) >> { args ->
def argument = args[0]
assert expectedValue = argument.actualValue
}
Run Code Online (Sandbox Code Playgroud)
使用 Mockito(和 JUnit),我认为可以完成的唯一方法是使用doAnswerand verify,例如:
doAnswer(new Answer() {
//check arguments here
}).when(service).operate(any(Data.class));
Run Code Online (Sandbox Code Playgroud)
然后我必须验证该操作是否实际被调用:
verify(service).operate(any(Data.class));
Run Code Online (Sandbox Code Playgroud)
但是,上面的代码会干扰,doAnswer好像它是对相关方法的实际调用。我如何解决这个问题,以便我既可以验证方法是否被调用,又可以验证它获取的参数是否正确?
我已经了解了HttpClient如何LocalTestServer用于自动化测试,但我似乎无法找到它被移动的位置.我尝试httpclient使用tests分类器定义依赖:
'org.apache.httpcomponents:httpclient:4.5.2:tests'
Run Code Online (Sandbox Code Playgroud)
但似乎没有LocalTestServer定义一个类.这已经停止了吗?
我的代码中有以下注释:
@ComponentScan(basePackageClasses={MyClass.class},
excludeFilters={@Filter(Component.class)}, //@Component
includeFilters={@Filter(type=ASSIGNABLE_TYPE, classes=MyClass.class)}
)
Run Code Online (Sandbox Code Playgroud)
MyClass带有注释@Component但仍希望在组件扫描期间包含它。但是,组件扫描过滤器似乎使用和逻辑而不是或。我如何实现我想做的事?
在我目前的设置中,我使用的是Hazelcast集群管理器的默认多播选项.当我链接我的容器化Vertx模块的实例(通过Docker网络链接)时,我可以看到他们成功创建了Hazelcast集群.但是,当我尝试从一个模块在事件总线上发布事件时,另一个模块不会对它做出反应.我不确定Hazelcast群集中的网络设置如何与事件总线的网络设置相关.
目前,我为每个Vert.x模块配置了以下编程配置,每个模块都部署在一个docker容器中.
ClusterManager clusterManager = new HazelcastClusterManager();
VertxOptions vertxOptions = new VertxOptions()
.setClustered(true)
.setClusterManager(clusterManager);
vertxOptions.setEventBusOptions(new EventBusOptions()
.setClustered(true)
.setClusterPublicHost("application"));
Run Code Online (Sandbox Code Playgroud)
Vert.x Core手册指出我可能需要配置clusterPublicHost和clusterPublicPort事件总线,但我不确定它们与一般网络拓扑有何关联.
我已经建立了自己的机制来为我的域对象分配身份,因此在持久化它们时,跟踪MongoDB分配给他们的东西确实没有太大价值。但是,我为域类命名标识字段是id因为它简洁明了且易于理解。问题在于,根据文档,Spring会自动将此字段映射到MongoDB分配的ObjectID。如何避免发生这种情况,而不必重命名我的id字段,或@Id仅为了解决此问题而定义带有注释的自定义标识字段?
我的最终目标实际上是在我的 Enum 类中创建一个辅助方法,该方法总是返回一个 Enum 成员并且从不引发异常,给定任何可能的值,例如
Color.from_value('red')
Run Code Online (Sandbox Code Playgroud)
如果该值不是枚举的一部分,则辅助方法将返回一个默认值,例如Color.UNKNOWN。
根据另一个相关问题的答案,我可以通过一些内置成员列出这些值来检查这些值。但是,我接下来要做的是跟踪内部成员中的所有值,这样我就不必每次调用辅助方法时都遍历这些值。我尝试做类似以下的事情:
class Color(Enum):
RED = 'red'
BLUE = 'blue'
GREEN = 'green'
# this doesn't work
_values = [item.value for item in Color]
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它不起作用。这可能是 Python 枚举中已经内置的东西吗?
我一直在尝试使用用于 PropertyUtils 的 getProperty 的索引符号来检索作为映射值包含的列表中的元素。这是一个示例(我在这里使用的是通用语法):
map = {"aList": ["elem1", "elem2", "elem3"]}
Run Code Online (Sandbox Code Playgroud)
比方说,我想获得值“elem2”,我正在尝试使用:
PropertyUtils.getProperty(map, "aList[1]");
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用。我总是得到一个空值。有没有其他方法可以做到这一点。明确地说,我知道我可以做一个getProperty("aList").get(0)(当然是在显式转换之后),但我正在研究一个需要上述代码才能工作的解决方案。
我有以下控制器代码:
@Transactional
def save(MyModel model) {
model.save()
}
Run Code Online (Sandbox Code Playgroud)
我正在测试它使用:
request.json = new MyModel(property1: 1, property2: 2)
controller.save()
Run Code Online (Sandbox Code Playgroud)
但是,每次运行测试时,我都会得到NullPointerException,因为它model是null.我是否需要放置任何其他代码才能使绑定正常工作?
Most of my experience with creating controllers with Spring are for REST controllers that consume JSON formatted requests. I've been searching for documentation on how to do testing for form submission, and so far this is how I understand it should go using MockMvc:
MvcResult result = mockMvc.perform(post("/submit")
.param('title', 'test title')
.param('description', 'test description'))
.andReturn()
Run Code Online (Sandbox Code Playgroud)
However, I'm not sure how to map the form parameters to a model object. I've seen the @ModelAttribute annotation pop up in my searches …
我正在使用私有 Maven 存储库的有限开发环境中工作。其中托管了我正在尝试使用的 Gradle 插件。但是,我不认为它遵循 Gradle 插件的预期命名和目录结构,因此当我使用 Plugin DSL 时,我的构建失败。在 Maven 存储库中,插件的结构如下:
com.mydomain.project:mydomain-plugin:1.0.0
Run Code Online (Sandbox Code Playgroud)
当我使用 Gradle 插件 DSL 引用此插件时,使用以下定义:
plugins {
id 'com.mydomain.project' version '1.0.0'
}
Run Code Online (Sandbox Code Playgroud)
我的构建出现错误,抱怨找不到com.mydomain.project:com.mydomain.poject.gradle.plugin:1.0.0. 然而,似乎没有办法通过插件 DSL 来指示该插件使用不同的工件 id 模式。有什么想法如何解决这个问题吗?
我想PowerMockerRule在我的单元测试中使用,以便我可以在使用Spring的JUnit Runner运行它们时使用PowerMockito.但是,当我将规则添加到我的测试中时,我得到了java.lang.VerifyError.
java.lang.VerifyError: Expecting a stackmap frame at branch target 47
Exception Details:
Location:
com/sample/package/MyClass.<init>(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V @25: if_icmpge
Reason:
Expected stackmap frame at this location.
Bytecode:
0x0000000: 2a2b 2c01 c000 32b7 0050 2d3a 0419 04be
0x0000010: 3605 0336 0615 0615 05a2 0016 1904 1506
0x0000020: 323a 072a 1907 b600 4984 0601 a7ff e9b1
0x0000030:
Run Code Online (Sandbox Code Playgroud)
到目前为止我所做的一直是根据我的初始搜索将我的javassist依赖关系更新为3.20.0-GA,这通常是问题所在.但是,它仍然无法解决我的问题.还有其他想法吗?