当前位置: 首页 > 知识库问答 >
问题:

Springboot REST应用程序应接受并生成XML和JSON

严心水
2023-03-14

我正在开发Springboot REST API。我的应用程序应该同时使用和生成XML和JSON。我遇到了Jackson json Xml依赖项。

    <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        <version>2.5.4</version>
    </dependency>

我在我的pom.xml.中添加了这个,现在我可以接受xml输入,但是当映射到Java对象时,这些值为空。以下是我的资源类。

@Configuration
@ImportResource("/application-context.xml")
@EnableAutoConfiguration
@ResponseBody
@RequestMapping("/match")
public class MatchResource {

    private static final Logger logger = LogManager.getLogger(MatchResource.class);

    @Autowired
    private MatchService matchService;

    @RequestMapping(method = RequestMethod.POST)
    @Consumes({MediaType.TEXT_XML,MediaType.APPLICATION_JSON})
    @Produces({MediaType.TEXT_XML,MediaType.APPLICATION_JSON})
    //@Produces( MediaType.APPLICATION_XML)
    public Response matchRequest(@RequestBody MatchRequest matchRequest,
                                 @Context HttpServletRequest headers) throws Exception {

        Response resp = null;
        MiniMatchResponse output = null;

        // Headers are store in the "headers" object. To retrieve a specific header, please take a look at the below statement
        String apiUser = headers.getHeader("Api-User");

        UUID randID = UUID.randomUUID();

        logger.info("Get Match for with ID: " + randID);

        // Get service profile from headers via MatchConstants.SERVICE_PROFILE_HEADER
        String serviceProfile = "";

        try {

            //TODO: MatchService should return MatchResponse Object

            //Json OutPut
            output = matchService.findResponse(matchRequest, serviceProfile);

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true);

            logger.debug("Match Request: " + matchRequest.toString());
        } catch (ErrorException e) {
            logger.error(e.getMessage(), e);
         }
         // Form Response
        resp = Response.status(200).entity(output).build();

        return resp;
    }

下面是我的请求对象

  package com.infoconnect.api.dto.Match;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.io.Serializable;
import java.util.List;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class MatchRequest implements Serializable {

    // Gets or sets the RequestType of request this represents.
    // Allowed values are "Company", "People" and "Any".
    private String requestType;
    private String name;
    private String companyName;
    private String streetAddress;
    private String streetAddress2;
    private String city;
    private String stateProvince;
    private String postalCode;
    private String country;
    private String serviceProfile;
    private String resourceType;
    private int limit;
    private Integer confidence;
    private String phone;
    private Boolean includeHistorical;
    private Boolean includeNonVerified;
    private String requestId;
    private List<String> fields;

    public String getRequestType() {
        return requestType;
    }

    public void setRequestType(String requestType) {
        this.requestType = requestType;
    }

    public String getName() {
        return name;
    }

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

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public String getStreetAddress() {
        return streetAddress;
    }

    public void setStreetAddress(String streetAddress) {
        this.streetAddress = streetAddress;
    }

    public String getStreetAddress2() {
        return streetAddress2;
    }

    public void setStreetAddress2(String streetAddress2) {
        this.streetAddress2 = streetAddress2;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getStateProvince() {
        return stateProvince;
    }

    public void setStateProvince(String stateProvince) {
        this.stateProvince = stateProvince;
    }

    public String getPostalCode() {
        return postalCode;
    }

    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getServiceProfile() {
        return serviceProfile;
    }

    public void setServiceProfile(String serviceProfile) {
        this.serviceProfile = serviceProfile;
    }

    public String getResourceType() {
        return resourceType;
    }

    public void setResourceType(String resourceType) {
        this.resourceType = resourceType;
    }  

    public int getLimit() {
        return limit;
    }

    public void setLimit(int limit) {
        this.limit = limit;
    }

    public Integer getConfidence() {
        return confidence;
    }

    public void setConfidence(Integer confidence) {
        this.confidence = confidence;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Boolean getIncludeHistorical() {
        return includeHistorical;
    }

    public void setIncludeHistorical(Boolean includeHistorical) {
        this.includeHistorical = includeHistorical;
    }

    public Boolean getIncludeNonVerified() {
        return includeNonVerified;
    }

    public void setIncludeNonVerified(Boolean includeNonVerified) {
        this.includeNonVerified = includeNonVerified;
    }

    public String getRequestId() {
        return requestId;
    }

    public void setRequestId(String requestId) {
        this.requestId = requestId;
    }

    public List<String> getFields() {
        return fields;
    }

    public void setFields(List<String> fields) {
        this.fields = fields;
    }

    @Override
    public String toString() {
        return "MatchRequest{" +
                "requestType='" + requestType + '\'' +
                ", name='" + name + '\'' +
                ", companyName='" + companyName + '\'' +
                ", streetAddress='" + streetAddress + '\'' +
                ", streetAddress2='" + streetAddress2 + '\'' +
                ", city='" + city + '\'' +
                ", stateProvince='" + stateProvince + '\'' +
                ", postalCode='" + postalCode + '\'' +
                ", country='" + country + '\'' +
                ", serviceProfile='" + serviceProfile + '\'' +
                ", resourceType='" + resourceType + '\'' +
                ", limit=" + limit +
                ", confidence=" + confidence +
                ", phone='" + phone + '\'' +
                ", includeHistorical=" + includeHistorical +
                ", includeNonVerified=" + includeNonVerified +
                ", requestId='" + requestId + '\'' +
                ", fields=" + fields +
                '}';
    }
}

JSON请求和响应工作正常。您能帮助我如何在我的应用程序中包含XML请求和响应吗。

共有1个答案

罗祺
2023-03-14

尝试将带有用作根标记的标记的@XmlRootElement(name=“myRootTag”)JAXB注释添加到类MatchRequest。在REST请求中同时使用XML和JSON作为传输格式,但使用moxy而不是Jackson时,我遇到了类似的问题。在任何情况下,正确的JAXB注释都是转换为XML或从XML转换过来所必需的(XML在这方面比JSON更挑剔)。

Jackson XML应该支持JAXB注释,如果这不起作用,它有自己的一组与JAXB不兼容的类似注释(参见https://github.com/FasterXML/jackson-dataformat-xml和https://github.com/FasterXML/jackson-dataformat-xml/wiki/Jackson-XML-annotations)

 类似资料:
  • 主要内容:XML 文档实例,在 HTML div 元素中显示第一个 CD,实例,添加导航脚本,实例,当点击 CD 时显示专辑信息本章演示一些基于 XML, HTML, XML DOM 和 JavaScript 构建的小型 XML 应用程序。 XML 文档实例 在本应用程序中,我们将使用 "cd_catalog.xml" 文件。 在 HTML div 元素中显示第一个 CD 下面的实例从第一个 CD 元素中获取 XML 数据,然后在 id="showCD" 的 HTML 元素中显示数据。displ

  • 通过应用生成器工具 express-generator 可以快速创建一个应用的骨架。 你可以通过 npx (包含在 Node.js 8.2.0 及更高版本中)命令来运行 Express 应用程序生成器。 $ npx express-generator 对于较老的 Node 版本,请通过 npm 将 Express 应用程序生成器安装到全局环境中并执行即可。 $ npm install -g ex

  • 我需要为ant创建构建文件来构建我的,我已经搜索了很多,但没有任何帮助。它仍然显示错误并且不编译。当我尝试运行jar文件时,jar文件无法被删除。这里是 这里是错误

  • 在运行mvn spring-boot:run命令时,我无法找出什么是错误的。mvn clean install使构建成功,但对于mvn spring-boot:run,我得到一个构建失败。这是运行mvn spring-boot时控制台中的错误日志:run-x。 这是我的pom.xml。我还从eclipse ide中的活动maven配置文件中删除了pom.xml,原因是它作为本链接中的解决方案之一给

  • 当我发出请求时,我会得到一个XML响应,但我需要的是JSON。在文档中,为了得到一个JSON,需要声明:使用HTTP头。 在哪里可以找到要放入的HTTP头? 我猜它不应该在URL请求中,如下所示:

  • 我需要编写一个 rest 服务,它接受 XML/JSON 作为输入(POST 方法)和 XML/JSON 作为输出(基于输入格式)。我尝试了以下方法来实现这一目标,但没有帮助。终结点方法同时接受 XML/JSON,但在响应时,它始终根据 @RequestMapping -produces 中指定的顺序提供 JSON 或 XML。任何帮助将不胜感激。 我的endpoint方法: POJO班:学生.j

  • 问题内容: 当我发出请求时,我得到了XML响应,但是我需要的是JSON。在文档中进行了说明,以获取JSON作为回报:使用HTTP标头。 在哪里可以找到HTTP标头? 我的猜测是它不是应该位于URL请求中,它看起来像: 问题答案: 您猜对了,HTTP标头不是URL的一部分。 而且,当您在浏览器中键入URL时,将使用标准标头发出请求。无论如何,不​​要通过在浏览器的地址栏中键入终结点来使用REST A

  • 我有一个用Kotlin(android studio)编写的android应用程序和用React Native编写的应用程序的UI。我的问题是这些能联系在一起吗?如果是,怎么做?还有,你们能发布一些我可以通过的链接吗。 附注:我对react Native一无所知。