【问题标题】:What are the depencencies to be added to get the XML output in spring-mvc?在 spring-mvc 中获取 XML 输出需要添加哪些依赖项?
【发布时间】:2016-01-18 01:11:32
【问题描述】:

在不配置内容协商视图解析器和管理器的情况下,需要添加哪些 maven 依赖项才能获得 XML 输出。通过使用基于类路径上的 jar 的默认消息转换器(基于接受标头的输出)。我可以通过对类路径具有 jackson-databind 依赖项来获得 JSON 输出。对于我正在使用的 XML

		<dependency>
			<groupId>javax.xml.bind</groupId>
			<artifactId>jaxb-api</artifactId>
			<version>2.2.7</version>
		</dependency>

		<dependency>
			<groupId>com.sun.xml.bind</groupId>
			<artifactId>jaxb-impl</artifactId>
			<version>2.2.7</version>
		</dependency>

	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-oxm</artifactId>
		<version>${org.springframework.version}</version>
	</dependency>

依赖项 - 我无法获得 XML 输出。我是否需要在配置文件中将任何 Marshaller(如 Jaxb2Marsahllar)配置为 bean。任何人都可以发布 JAXB2 的 Maven 依赖项。

我的实体类:

    package com.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.hibernate.validator.constraints.NotEmpty;

@Entity
@Table(name = "Employee")
@XmlRootElement
public class Employee {

    public Employee() {
    }

    public Employee(Integer empno, String name, String dept, Double salary) {
        this.empno = empno;
        this.name = name;
        this.dept = dept;
        this.salary = salary;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer empno;

    @Size(min = 1, max = 30)
    @NotEmpty
    private String name;

    @NotEmpty
    @Size(min = 1, max = 30)
    private String dept;

    /*
     * @NotEmpty - cannot be set to double - supports String Collection Map
     * arrays
     */

    private Double salary;

    @XmlAttribute
    public Integer getEmpno() {
        return empno;
    }

    public void setEmpno(Integer empno) {
        this.empno = empno;
    }

    @XmlElement
    public String getName() {
        return name;
    }

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

    @XmlElement
    public String getDept() {
        return dept;
    }

    public void setDept(String dept) {
        this.dept = dept;
    }

    @XmlElement
    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Employee [empno=" + empno + ", name=" + name + ", dept=" + dept
                + ", salary=" + salary + "]";
    }
}

我的控制器类:

@Controller

公共类 EmployeeController {

@Autowired
EmployeeRepository employeeRepository;


@RequestMapping(value = "/employees", method=RequestMethod.GET,
        produces= {MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE})
public @ResponseBody List<Employee> findAllXml(){
    return employeeRepository.findAll();
}

}

请任何人说依赖是否足够?需要补充什么..

【问题讨论】:

  • 能否请您显示您的应用程序 context.xml

标签: spring spring-mvc


【解决方案1】:

@XMLElement 放在设置方法上。

public Integer getEmpno() {
    return empno;
}

@XmlAttribute
public void setEmpno(Integer empno) {
    this.empno = empno;
}


public String getName() {
    return name;
}

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

或者你可以使用 spring-oxm.jar 的 Spring Marshalling View

<bean id="xmlViewer" 
    class="org.springframework.web.servlet.view.xml.MarshallingView">
    <constructor-arg>
      <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="classesToBeBound">
            <list>
                <value>com.model.Employee</value>
            </list>
        </property>
      </bean>
    </constructor-arg>
</bean>

更新:1 findAll 还返回列表,该列表需要包含在父标签中,例如

 <Employees>
  <Employee />
  <Employee />
</Employees>

因此您需要定义一个具有@XMLElement 实体的类作为List&lt;Employees&gt; 创建它的对象,将数据放入其中并返回该对象。

【讨论】:

【解决方案2】:

我找到了 406 异常的答案

问题需要为 XML 输出的消息转换器进行额外配置。

对于 XML 输出,我们需要在 RequestMappingHandlerAdapter 的消息转换器列表中添加一个消息转换器

但是对于 JSON,我们不需要明确地这样做,基于 classpath 上的 jackson-databind 依赖关系,我们可以得到 JSON 输出。但是对于xml,我们需要添加一个消息转换器(MarshallingHttpMessageConverter)。

示例:使用基于 Java 的配置:将 RequestMappingHandlerAdapter 配置为 bean 并添加所需的消息转换器...

@Bean
public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
    RequestMappingHandlerAdapter adapter = new RequestMappingHandlerAdapter();

    List<HttpMessageConverter<?>> converters = new ArrayList();
    converters.add(new MarshallingHttpMessageConverter(
            new XStreamMarshaller()));
    converters.add(new MappingJackson2HttpMessageConverter());

    adapter.setMessageConverters(converters);
    return adapter;
}

我正在使用 XStream Marshaller,所以还需要添加它的依赖项

<dependency>
	<groupId>com.thoughtworks.xstream</groupId>
	<artifactId>xstream</artifactId>
	<version>1.4.8</version>
</dependency>

示例测试:

    @Test
public void testXml() throws Exception {
    this.mvc.perform(get("/employees/xml").accept(APPLICATION_XML))
    .andDo(print())
    .andExpect(content().contentType("application/xml"));       
}


@Test
public void testJson() throws Exception {
    this.mvc.perform(get("/employees/json").accept(APPLICATION_JSON))
    .andDo(print())
    .andExpect(content().contentType("application/json"));      
}

如果您知道任何其他方法,请发布。 有用链接:Spring XML 406 error

【讨论】:

    猜你喜欢
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2016-09-28
    • 1970-01-01
    • 2021-10-28
    • 2019-09-17
    • 1970-01-01
    相关资源
    最近更新 更多