首页 > 解决方案 > Spring MVC 中的 ContentNegotiatingViewResolver 问题

问题描述

我想获取我的实体的 XML 和 JSON 格式。为此,我想在我的代码中使用ContentNegotiatingViewResolver 。

这是我的代码的依赖部分:

<dependencies>
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.4</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.8</version>
        </dependency>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>2.6.0</version>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.200</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>       
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
            <version>5.3.9</version>
            <scope>compile</scope>
        </dependency>        
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.0-rc2</version>
            <scope>compile</scope>
        </dependency> 
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>       
    </dependencies>

在我的WebApplicationContextConfig.java中,我为 JSON 视图添加了以下函数:

@Bean
public MappingJackson2JsonView jsonView() {
  MappingJackson2JsonView jsonView = new MappingJackson2JsonView();
  jsonView.setPrettyPrint(true);
  return jsonView;
}

我为XML添加了 bean 配置,如下所示:

@Bean
public MarshallingView xmlView() {
  Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
  marshaller.setClassesToBeBound(Product.class);
  MarshallingView xmlView = new MarshallingView(marshaller);
  return xmlView;
}

我为ContentNegotiatingViewResolver添加了 bean 配置:

@Bean
public ViewResolver contentNegotiatingViewResolver( ContentNegotiationManager manager) {
  ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
  resolver.setContentNegotiationManager(manager);
  ArrayList<View> views = new ArrayList<>();
  views.add(jsonView());
  views.add(xmlView());
  resolver.setDefaultViews(views);
  return resolver;
}

我有一个名为Product.java的域类,它的组织方式如下:

package com.javapoint.domain;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.multipart.MultipartFile;

import com.fasterxml.jackson.annotation.JsonIgnore;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlRootElement
public class Product implements Serializable {
    
    private static final long serialVersionUID = 3678107792576131001L;
    private String productId;
    private String name;
    private BigDecimal unitPrice;
    private String description;
    private String manufacturer;
    private String category;
    private long unitsInStock;
    private long unitsInOrder;
    private boolean discontinued;
    private String condition;
    @JsonIgnore
    private MultipartFile productImage;
    @JsonIgnore
    private MultipartFile userManual;
    
    @DateTimeFormat(pattern = "dd-MM-yyyy")
    private LocalDate creationDate;

    public Product() {
        super();
    }

    public Product(String productId, String name, BigDecimal unitPrice) {
        this.productId = productId;
        this.name = name;
        this.unitPrice = unitPrice;
    }

    
    
    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

    public String getName() {
        return name;
    }

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

    public BigDecimal getUnitPrice() {
        return unitPrice;
    }

    public void setUnitPrice(BigDecimal unitPrice) {
        this.unitPrice = unitPrice;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getManufacturer() {
        return manufacturer;
    }

    public void setManufacturer(String manufacturer) {
        this.manufacturer = manufacturer;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public long getUnitsInStock() {
        return unitsInStock;
    }

    public void setUnitsInStock(long unitsInStock) {
        this.unitsInStock = unitsInStock;
    }

    public long getUnitsInOrder() {
        return unitsInOrder;
    }

    public void setUnitsInOrder(long unitsInOrder) {
        this.unitsInOrder = unitsInOrder;
    }

    public boolean isDiscontinued() {
        return discontinued;
    }

    public void setDiscontinued(boolean discontinued) {
        this.discontinued = discontinued;
    }

    public String getCondition() {
        return condition;
    }

    public void setCondition(String condition) {
        this.condition = condition;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Product other = (Product) obj;
        if (productId == null) {
            if (other.productId != null)
                return false;
        } else if (!productId.equals(other.productId))
            return false;
        return true;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((productId == null) ? 0 : productId.hashCode());
        return result;
    }

    public LocalDate getCreationDate() {
        return creationDate;
    }

    public void setCreationDate(LocalDate creationDate) {
        this.creationDate = creationDate;
    }

    @XmlTransient
    public MultipartFile getProductImage() {
        return productImage;
    }

    public void setProductImage(MultipartFile productImage) {
        this.productImage = productImage;
    }

    @XmlTransient
    public MultipartFile getUserManual() {
        return userManual;
    }

    public void setUserManual(MultipartFile userManual) {
        this.userManual = userManual;
    }   
    
}

我有一个ProductController来管理项目的控制器方面。下面的函数负责通过 id 获取产品:

@RequestMapping("/product")
public ModelAndView getProductById(@RequestParam("id") String productId, Model model) {

        ModelAndView result = new ModelAndView("product");

        result .addObject("product", productService.getProductById(productId));

        return result ;
}

每当我调用 http://localhost:8080/springmvc197/product?id=P1235 时,它都能正常工作,但是每当我调用 http://localhost:8080/springmvc197/product.xml?id=P1235 时,它都会给出错误“警告: 没有 GET /springmvc197/product.xml 的映射”。我哪里错了?

提前致谢。

标签: spring-mvcdata-bindingjackson-databind

解决方案


推荐阅读