spring-mvc - 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 的映射”。我哪里错了?
提前致谢。
解决方案
推荐阅读
- sql-server - 由于错误 0x80070057“参数不正确。” SSIS 作业无法运行
- apache-spark - “避免每个集群有多个 Kudu 客户端”是什么意思?
- jquery - 使用 jQuery 会话在页面更改时保持购物车总数
- python - Python PIL 完全删除每个 alpha 通道
- flutter - 间接导出的类不可见
- java - 使用 WebElement 对象检查元素是否存在
- python - 是否有根据带有索引的向量进行排序的 numpy 函数?
- tcl - 如何检查变量的值在 32 位操作系统的 MAX_INT 和 MIN_INT 之间
- php - 为什么 time()-$_SERVER["REQUEST_TIME_FLOAT"] 在 php-cli 中关闭 1 秒?
- javascript - 在 Chrome 扩展中构建 ContextMenu 时如何将变量传递给另一个 HTML 页面?