Le convertisseur de messages HTTP personnalisé n'est pas utilisé, 415 Type de support non pris en charge
Je suis entrain de créer une application de test pour réaliser la conversion de Chaîne de caractères XML pour objet Employé avant d'être transmises au contrôleur. Je ne veux pas utiliser JAXB convertisseur, parce que le but est de tester Personnalisé Message HTTP Convertisseur qui je vais utiliser dans mon cas d'utilisation qui implique d'analyse XML à l'aide de parser SAX et certaines règles complexes.
Voici les principales étapes:
- Création de Employee.java Classe : Objet du Domaine
- Création de EmployeeManagementController.java classe : Spring MVC, Contrôleur de Gestion Employé
- Création de EmployeeConverter.java : Personnalisé Convertisseur pour la Conversion de la Chaîne XML pour Objet Employé.
- Création de employee-servlet.xml : Printemps fichier de Configuration
- Création de web.xml : Le Descripteur de Déploiement
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<Employee>{
@Override
protected Employee readInternal(Class<? extends Employee> arg, HttpInputMessage inputMsg) throws IOException,
HttpMessageNotReadableException {
//TODO Auto-generated method stub
Map<String,String> 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<String,String> getPostParameter(HttpInputMessage input) throws IOException{
String payload = null;
String[] params = null;
BufferedReader buf = new BufferedReader(new InputStreamReader(input.getBody()));
Map<String,String> paramMap = new HashMap<String,String>();
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;
}
}
employee-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.1.xsd">
<mvc:default-servlet-handler/>
<context:component-scan base-package="com"/>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="com.converter.EmployeeConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="json" value="application/json"/>
<entry key="xml" value="text/xml"/>
<entry key="htm" value="text/html"/>
</map>
</property>
<property name="defaultContentType" value="text/html"/>
</bean>
<!-- <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<util:list id="beanList">
<ref bean="employeeConverter"/>
</util:list>
</property>
</bean> -->
<!-- <bean id="employeeConverter" class="com.converter.EmployeeConverter"/> -->
</beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>TestConverter</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>employee</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>employee</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/employee-servlet.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
Quand j'utilise FireFox RestClient je reçois la Réponse : 415 Unsupproted Type de Média.
J'ai défini le Type de Contenu et d'Accepter d'en-tête en tant que text/xml dans RestClient et passer à la suivante, la chaîne XML dans le corps comme paramètre:
xml=<employee><name>Jack</name><designation>Account Director</designation><skill>Commuication</skill></employee>
Quelqu'un peut-il aider et laissez-moi savoir quels sont les changements nécessaires? J'ai aussi essayé d'utiliser AnnotationMethodHandlerAdapter
pour enregistrer le message converter.
source d'informationauteur Raghave Shukla
Vous devez vous connecter pour publier un commentaire.
1. Définir Le Type De Média
De la comparaison de votre mise en œuvre avec certains
HttpMessageConverter
implémentations fournies par un Ressort (par exemple MappingJackson2HttpMessageConverter), montre que vous avez oublié de définir lesupportedMediaTypes
.La commune* de
HttpMessageConverter
qui s'étendAbstractHttpMessageConverter<T>
est de définir le type de support dans le constructeur, à l'aide de la super constructeurAbstractHttpMessageConverter.(MediaType supportedMediaType)
.BTW 1: vous pouvez également vous inscrire plus d'un type de support**
BTW 2: pour xml conterter on doit penser à s'étendant à partir de
AbstractXmlHttpMessageConverter<T>
2. Inscrivez-vous Converter
L'inconvénient majeur de
<mvc:message-converters>
est, que ce remplacer la configuration par défaut, de sorte que vous devez également vous inscrire par défaut tous lesHttpMessageConverter
explicite.De garder le message par défaut convertes, vous devez utiliser:
<mvc:message-converters register-defaults="true">...
AbstractXmlHttpMessageConverter<T>