自定义HTTP消息转换器未使用,415 Unsupproted媒体类型

我正在创建一个测试应用程序,以便在传递给控制器​​之前实现从XML String到Employee对象的转换。 我不想使用JAXB转换器,因为我的目的是测试自定义HTTP消息转换器,我将在我的实际用例中使用它涉及使用SAX解析器和一些复杂规则进行XML解析。

以下是执行的关键步骤:

  • 创建Employee.java类 :域对象
  • 创建EmployeeManagementController.java类 :用于管理员工的Spring MVC控制器
  • 创建EmployeeConverter.java :用于将XML字符串转换为Employee对象的自定义转换器。
  • 创建employee-servlet.xml :Spring配置文件
  • 创建web.xml :部署描述符

Employee.java

@Component @XmlRootElement(name="employee") @XmlAccessorType(XmlAccessType.FIELD) public class Employee{ @XmlElement(name="name") String name; @XmlElement(name="designation") String designation; @XmlElement(name="skill") String skill; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDesignation() { return designation; } public void setDesignation(String designation) { this.designation = designation; } public String getSkill() { return skill; } public void setSkill(String skill) { this.skill = skill; } } 

EmployeeManagementController.java

 @Controller @RequestMapping(value="/emp") public class EmployeeManagementController { @RequestMapping(value="/add/employee", method=RequestMethod.POST, consumes="text/html") public void addEmployee(@RequestBody Employee employee){ System.out.println("Employee Name : "+employee.getName()); System.out.println("Employee Designation : "+employee.getDesignation()); System.out.println("Employee Skill : "+employee.getSkill()); } } 

EmployeeConverter.java

 @Component public class EmployeeConverter extends AbstractHttpMessageConverter{ @Override protected Employee readInternal(Class arg, HttpInputMessage inputMsg) throws IOException, HttpMessageNotReadableException { // TODO Auto-generated method stub Map paramMap = getPostParameter(inputMsg); BufferedReader file = new BufferedReader(new StringReader(paramMap.get("xml"))); Employee employee = null; JAXBContext jaxbContext; try { jaxbContext = JAXBContext.newInstance(Employee.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); employee = (Employee) jaxbUnmarshaller.unmarshal(file); } catch (JAXBException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(employee); return employee; } @Override protected boolean supports(Class type) { if(type.getSimpleName().equalsIgnoreCase("Employee")){ return true; } return false; } @Override protected void writeInternal(Employee arg0, HttpOutputMessage arg1) throws IOException, HttpMessageNotWritableException { // TODO Auto-generated method stub } private Map getPostParameter(HttpInputMessage input) throws IOException{ String payload = null; String[] params = null; BufferedReader buf = new BufferedReader(new InputStreamReader(input.getBody())); Map paramMap = new HashMap(); String line=""; while((line = buf.readLine())!=null){ payload = payload+line; } if(payload.contains("&")){ params = payload.split("&"); for(String param : params){ paramMap.put(param.split("=")[0],param.split("=")[1]); } } return paramMap; } } 

员工servlet.xml中

                    <!--        --> <!--  -->  

web.xml中

   TestConverter  index.html   employee org.springframework.web.servlet.DispatcherServlet 1   employee /*   contextConfigLocation /WEB-INF/employee-servlet.xml   org.springframework.web.context.ContextLoaderListener   

当我使用FireFox RestClient时,我得到响应为: 415 Unsupproted Media Type。

我在RestClient中将Content-Type和Accept标头设置为text / xml,并将body中的以下XML字符串作为参数传递:

 xml=JackAccount DirectorCommuication 

有人可以帮忙,让我知道需要进行哪些更改? 我还尝试使用AnnotationMethodHandlerAdapter来注册消息转换器。

1.设置媒体类型

将您的实现与Spring提供的一些HttpMessageConverter实现(例如’MappingJackson2HttpMessageConverter’)进行比较,表明您错过了定义supportedMediaTypes

扩展AbstractHttpMessageConverterHttpMessageConverter的常用方法是使用超级构造函数AbstractHttpMessageConverter.(MediaType supportedMediaType)在构造函数中设置媒体类型。

  public class EmployeeConverter extends AbstractHttpMessageConverter { public EmployeeConverter() { super(new MediaType("text", "xml", Charset.forName("UTF-8"))); } } 

顺便说一句:您还可以注册多个媒体类型**

 super(MediaType.APPLICATION_XML, MediaType.TEXT_XML, new MediaType("application", "*+xml")); 

BTW 2:对于xml conterter,应该考虑从AbstractXmlHttpMessageConverter扩展

2.注册转换器

   ...    

的主要缺点是,这取代了默认配置,因此您还必须显式注册所有默认的HttpMessageConverter

要保持默认消息转换,您需要使用: ...

  • *由MappingJackson2HttpMessageConverter’等其他实现使用
  • **示例来自AbstractXmlHttpMessageConverter