- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经创建了如下的 REST 响应
@XmlRootElement(name = "customer_info")
@JsonIgnoreProperties(value = { "map" })
public class Customer {
private String name;
private Integer id;
private long time;
private Map<String, Object> map = new TreeMap<>();
@JsonAnyGetter
public Map<String, Object> getMap() {
return map;
}
@JsonAnySetter
public void setMap(String name, Object values) {
this.map.put(name, values);
}
}
我想使用附加参数动态创建此响应。后端返回一个 map ,其中将包含此附加 Prop 。
<customer_info>
<name></name>
<id></id>
<!--The below will have dynamic prop based on key-->
<dynamic1></dynamic1>
<dynamic2></dynamic2>
</customer_info>
应用配置
ResourceConfig config = new DefaultResourceConfig();
config.add(resources);
Map<String, MediaType> type = config.getMediaTypeMappings()
type.put("json", MediaType.APPLICATION_JSON_TYPE);
type.put("xml", MediaType.APPLICATION_XML_TYPE);
servletHandler.addServlet(new ServletHolder(new ServletContainer(config)), "/*");
当我添加 map 时,xml 结构如下所示,这是不正确的。我需要上面的 xml 结构。有人可以指导我如何实现吗?
此外,XML 元素的名称应与映射中的键相同。JSON 响应正常但 xml 结构不正确。
<customer_info>
<name></name>
<id></id>
<!--The below will have dynamic prop based on key-->
<map>
<entry>
<key>dummy_param1</key>
<value>11</value>
</entry>
<entry>
<key>dummy_param2</key>
<value>10</value>
</entry>
<map>
</customer_info>
我使用 Jersey 作为 REST 框架并在 Jetty 服务器中运行。我正在使用提供程序并使用 spring 和 REST 服务对其进行注册。
<bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>
<bean class="com.dummy.CustomerService"/>
<bean class="com.dummy.Service2"/>
<bean class="com.dummy.Service3"/>
库gradle配置如下:
"org.codehaus.jackson:jackson-core-asl:1.9.2",
"org.codehaus.jackson:jackson-jaxrs:1.9.2",
"org.codehaus.jackson:jackson-mapper-asl:1.9.2",
"org.codehaus.jackson:jackson-xc:1.9.2",
"com.sun.jersey:jersey-client:1.12",
"com.sun.jersey:jersey-core:1.12",
"com.sun.jersey:jersey-json:1.12",
"com.sun.jersey:jersey-server:1.12",
"com.sun.jersey:jersey-servlet:1.12",
"org.codehaus.jettison:jettison:1.1",
"javax.ws.rs:jsr311-api:1.1.1",
"com.sun.jersey.contribs:jersey-apache-client:1.12",
"com.sun.jersey.contribs:jersey-apache-client4:1.12",
"com.sun.jersey.contribs:jersey-multipart:1.12",
"com.sun.jersey:jersey-client:1.12",
"com.sun.jersey:jersey-core:1.12",
"com.sun.jersey:jersey-json:1.12",
"javax.ws.rs:jsr311-api:1.1.1",
"org.codehaus.jackson:jackson-core-asl:1.9.2",
"org.codehaus.jackson:jackson-jaxrs:1.9.2",
"org.codehaus.jackson:jackson-mapper-asl:1.9.2",
"org.codehaus.jackson:jackson-xc:1.9.2",
"javax.servlet:javax.servlet-api:3.1.0",
"org.eclipse.jetty:ecs-jetty-server:9.4.0.v20161208",
"org.eclipse.jetty:jetty-util:9.4.0.v20161208",
"org.eclipse.jetty:jetty-servlet:9.4.0.v20161208",
"org.eclipse.jetty:jetty-servlets:9.4.0.v20161208",
"org.eclipse.jetty:jetty-http:9.4.0.v20161208",
"org.eclipse.jetty:jetty-security:9.4.0.v20161208",
"org.eclipse.jetty:jetty-io:9.4.0.v20161208",
"org.eclipse.jetty:jetty-continuation:9.4.0.v20161208",
"org.eclipse.jetty:jetty-deploy:9.4.0.v20161208",
"org.eclipse.jetty:jetty-webapp:9.4.0.v20161208",
"org.eclipse.jetty:jetty-xml:9.4.0.v20161208"
也有人可以建议如何解决上述问题吗?提前致谢。
最佳答案
使用 JAXB 是不可能的,但是如果您想切换到使用 Jackson for XML ,那么你很容易做到这一点。您需要做的就是注释 Map
用 @JsonAnyGetter
在你的 bean 中吸气.这将导致 Jackson 将映射键序列化为 XML 中的普通元素。这是一个测试
@Path("jackson-xml")
public class JacksonXmlResource {
@GET
@Produces("application/xml")
public Response get() {
Model model = new Model();
model.setProp("foo", "bar");
model.setProp("name", "Paul");
return Response.ok(model).build();
}
public static class Model {
private Map<String, Object> props = new HashMap<>();
@JsonAnyGetter
public Map<String, Object> getProps() {
return this.props;
}
@JsonAnySetter
public void setProp(String key, Object value) {
this.props.put(key, value);
}
}
}
这将导致以下 XML
<Model>
<foo>bar</foo>
<name>Paul</name>
</Model>
要使用 Jackson for XML,您需要执行以下操作:
添加 Jackson 依赖项并删除(排除)JAXB 提供程序
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<exclusions>
<exclusion>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-jaxb</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-xml-provider</artifactId>
<version>${jackson2.version}</version>
</dependency>
您应该从 jersey-container-servlet
中排除 JAXB 提供者你应该已经在你的项目中的依赖。 ${jackson2.version}
应该是您当前在项目中使用的 Jackson 的任何版本。如果您对 Jackson 没有任何明确的依赖性,但正在使用 jersey-media-json-jackson
,找出引入的 Jackson 版本。您要确保没有任何冲突版本。
您需要注册 JacksonJaxbXMLProvider
与 Jersey
public AppConfig extends ResourceConfig {
public AppConfig() {
register(JacksonJaxbXMLProvider,class);
}
}
完成这两件事后,它应该可以工作了。
将 Jackson 用于 XML 的好处在于,用于 JSON 的相同 Jackson 注释也可用于 XML,例如 @JsonProperty
. Jackson 还理解 JAXB 注释(其中大部分)。因此,当您从 JAXB 迁移到 Jackson 时,您可能只保留相同的 JAXB 注释。至于 Prop 顺序,它不适用于动态属性,仅适用于已经定义的属性。
ContextResolver<XmlMapper>
如果您不能向您的项目添加任何新的依赖项,那么实现此目的的另一种方法是使用 org.w3c.dom
动态创建 XML API,它们是标准的 Java 类。它会更加冗长和更多的工作,但它会得到你想要的。参见 this post一些解释。这是一个例子。添加的评论应该很容易理解。
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@Path("dom-api")
public class DomXmlResource {
@GET
@Produces("application/xml")
public Response getXml() throws Exception {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
// create root element
Element rootEl = doc.createElement("Model");
doc.appendChild(rootEl);
Model model = new Model();
model.setProp("foo", "bar");
model.setProp("name", "Paul");
model.setValue("FooBar");
// set static defined properties
Element valueEl = doc.createElement("value");
valueEl.appendChild(doc.createTextNode(model.getValue()));
rootEl.appendChild(valueEl);
// set dynamic properties
for (Map.Entry<String, Object> entry: model.getProps().entrySet()) {
Element dynamicEl = doc.createElement(entry.getKey());
dynamicEl.appendChild(doc.createTextNode(String.valueOf(entry.getValue())));
rootEl.appendChild(dynamicEl);
}
// return StreamingOutput so we can just stream the
// XML results without having to store the String into memory.
StreamingOutput entity = new StreamingOutput() {
@Override
public void write(OutputStream out)
throws IOException, WebApplicationException {
try {
// write the XML structure to the output stream.
Transformer transformer = TransformerFactory.newInstance()
.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
StreamResult result = new StreamResult(out);
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
};
return Response.ok(entity).build();
}
public static class Model {
private String value;
private Map<String, Object> props = new HashMap<>();
public String getValue() {
return this.value;
}
public void setValue(String value) {
this.value = value;
}
public Map<String, Object> getProps() {
return this.props;
}
public void setProp(String key, Object value) {
this.props.put(key, value);
}
}
}
关于java - REST java 中的通用响应处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51836068/
我正在尝试检查 Entry 中是否存在重复项,并使用内联消息提醒用户该数字存在。 $(document).ready(function(){ $("#con1").blur(function(
我有一个基于类的 View 。我在引导模式上使用 Ajax。为了避免页面刷新,我想使用此类基于 View 返回 JSON 响应而不是 HTTP 响应,但我只看到了如何为基于函数的 View 返回 JS
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我有一个大型内部企业基于 Web 的应用程序在 IIS6 上运行 ASP.NET 3.5,生成 401 个“未经授权”响应,然后是 200 个“Ok”响应(如 Fiddler 所述)。我知道为什么会发
感谢您研究我的问题。 我有一个node/express服务器,配置了一个server.js文件,它调用urls.js,而urls.js又调用 Controller 来处理http请求,所有这些都配置相
当我使用以下命令时,我得到正确的 JSON 响应: $ curl --data "regno=&dob=&mobile=" https://vitacademics-rel.herokuapp.co
我有一个非常简单的 RESTful 服务,它通过 POST 接收一些表单数据,其目的是在云存储(Amazon S3、Azure Blob 存储等)中简单地保留文本主体(具有唯一 ID)作为一个文件..
UDP 不发送任何 ack,但它会发送任何响应吗? 我已经设置了客户端服务器UDP程序。如果我让客户端向不存在的服务器发送数据,那么客户端会收到任何响应吗? 我的假设是; 客户端 --> 广播服务器地
我有一个电梯项目,其中 有一个扩展 RestHelper 的类,看起来像这样 serve{ "api" / "mystuff" prefix { case a
我们正在寻求覆盖 Kong 错误响应结构并编写自定义消息(即用我们的自定义消息替换“超出 API 速率限制”、“无效的身份验证凭据”等)。 我们要找的错误响应结构(代码是自定义的内部错误代码,与HTT
我正在尝试监听 EKEventStoreChangedNotification 以检查当我的应用程序处于后台时日历是否已更改。 我在 View Controller 的 initWithNibMeth
我了解 javascript,并且正在学习 ASP.NET C# 我想要做什么(完成的是javascript): document.getElementById('divID-1'
是否可以过滤所有 har 对象并仅获取 POST 请求/响应?也许在初始化 BrowserMobProxyServer 期间是这样做的方法?我需要将 har 对象保存到文件中并上传到 har 查看器。
我正在尝试向 Oauth 的 API 发送响应。遗憾的是,Symfony2 文档在解释 $response->headers->set(...); 的所有不同部分方面做得很差。 这是我的 OauthC
我正在尝试测试用例来模拟 api 调用,并使用 python 响应来模拟 api 调用。 下面是我的模拟, with responses.RequestsMock() as rsps: url
在尝试在 Haskell 中进行一些领域驱动设计时,我发现自己遇到了这个问题: data FetchAccessories = FetchAccessories data AccessoriesRes
我正在与 ANT+ USB 棒连接,并用项目 react 器替换我自己天真的“MessageBus”,因为它看起来非常合适。 USB接口(interface)本质上是异步的(单独的输入/输出管道),我
我正在将项目迁移到AFNetworking 2.0。使用AFNetworking 1.0时,我编写了代码来记录控制台中的每个请求/响应。这是代码: -(AFHTTPRequestOperation *
我有以下代码段。 ajaxRequest.onreadystatechange = function(){ if(ajaxRequest.readyState == 4){
我有问题......我在 php 中有一个监听器脚本可以执行以下操作: if ($count != 1) {echo 'no';} else { echo "yes";} 因此它会回显"is"或“
我是一名优秀的程序员,十分优秀!