comment convertir la chaîne uri type d'objet complexe au printemps
-
28-09-2019 - |
Question
Je me demande, je peux convertir la chaîne uri à un autre type d'objet?
@RequestMapping(value="/key/{keyDomain}", method=RequestMethod.GET)
public String propertyEditor(@PathVariable(value="keyDomain") KeyDomain key, Model model){
model.addAttribute("key", key);
return "propertyEditor";
}
et ici ma configuration
<beans:bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<beans:property name="customEditors">
<beans:map>
<!-- <beans:entry key="com.template.baseline.domain.KeyDomain" value="com.template.baseline.propertyEditor.KeyPropertyEditor"/> -->
<beans:entry key="com.template.baseline.domain.KeyDomain">
<beans:ref bean="keyDomainPropertyEditor" />
</beans:entry>
</beans:map>
</beans:property>
</beans:bean>
<!-- key domain property editor bean -->
<beans:bean id="keyDomainPropertyEditor" class="com.template.baseline.propertyEditor.KeyPropertyEditor">
<beans:property name="keyDomain">
<beans:bean class="com.template.baseline.domain.KeyDomain" />
</beans:property>
</beans:bean>
et PropertyEditor Classe:
public class KeyPropertyEditor extends PropertyEditorSupport{
private KeyDomain keyDomain;
/**
* example : 10435
* - 10 will be keyId
* - 435 will be baseOfficeId
*/
@Override
public void setAsText(String text) throws IllegalArgumentException{
KeyDomain keyDomain = new KeyDomain();
keyDomain.setKeyId(Integer.parseInt(text.substring(0,1)));
keyDomain.setBaseOfficeId(Integer.parseInt(text.substring(2,4)));
setValue(keyDomain);
}
@Override
public String getAsText() {
KeyDomain value = (KeyDomain) getValue();
return (value != null ? value.toString() : "");
}
public void setKeyDomain(KeyDomain keyDomain) {
this.keyDomain = keyDomain;
}
}
Je pensais que je peux utiliser pour convertir éditeur de propriétés mon string URI devenir le type d'objet approprié. je l'ai déjà fait une mise en œuvre et configurer CustomEditorConfigurer, mais je reçois toujours ConversionNotSupportedException.
si j'ajouter initBinder à mon contrôleur, tout va très bien:
@InitBinder
public void setBinder(WebDataBinder dataBinder) {
dataBinder.registerCustomEditor(KeyDomain.class, new KeyPropertyEditor());
}
et je reçois Avertissement quelque chose comme ceci
WARN: org.springframework.beans.factory.config.CustomEditorConfigurer - passage d'une instance PropertyEditor en CustomEditorConfigurer est dépréciée: PropertyEditorRegistrars d'utilisation ou les noms de classe PropertyEditor à la place. Offending touche [com.template.baseline.domain.KeyDomain; offensant par exemple de l'éditeur: com.template.baseline.propertyEditor.KeyPropertyEditor@1a271f5
Merci pour la réponse.
ps: webBindingInitalizer injecté sur AnnotationMethodHandlerAdapter
<beans:bean id="AnnotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<beans:property name="webBindingInitializer">
<beans:bean class="com.template.baseline.initialize.CustomWebBindingInitializer" />
</beans:property>
</beans:bean>
et la mise en œuvre
public class CustomWebBindingInitializer implements WebBindingInitializer {
public CustomWebBindingInitializer(){
System.out.println("******** constructor *********");
}
public void initBinder(WebDataBinder binder, WebRequest request) {
System.out.println("******** initBinder *********");
binder.registerCustomEditor(KeyDomain.class, new KeyDomainPropertyEditor());
}
}
La solution
CustomEditorConfigurer
n'a rien à voir avec les données de demande web obligatoire.
Si vous voulez enregistrer votre PropertyEditor
globablly, vous devez implémenter WebBindingInitializer
et l'offre AnnotationMethodHandlerAdapter
avec elle:
<bean
class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<proeprty name = "webBindingInitializer">
<bean class = "MyWebBindingInitializer" />
</property>
</bean>
Une autre option consiste à mettre en œuvre votre logique de conversion en tant que Formatter
et le configurer via FormattingConversionServiceFactoryBean
et <mvc:annotation-driven>
, voir échantillon mvc-vitrine .