Ich habe versucht, @Autowire
ein Spring-Managed Service in meine Deserializer
. Jemand hat mich an Jackson mit dem Operator new
gekippt, als er die Serializer/Deserializer aufgerufen hat. Dies bedeutete keine Auto-Verdrahtung von Jackson's Instanz meiner Deserializer
. Hier ist, wie ich konnte meine Dienstklasse in meine Deserializer
@Autowire
:
context.xml
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="objectMapper" />
</bean>
</mvc:message-converters>
</mvc>
<bean id="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<!-- Add deserializers that require autowiring -->
<property name="deserializersByType">
<map key-type="java.lang.Class">
<entry key="com.acme.Anchor">
<bean class="com.acme.AnchorDeserializer" />
</entry>
</map>
</property>
</bean>
Jetzt, wo mein Deserializer
ist eine Feder-Managed Bean, Auto-Verkabelung funktioniert!
AnchorDeserializer.java
public class AnchorDeserializer extends JsonDeserializer<Anchor> {
@Autowired
private AnchorService anchorService;
public Anchor deserialize(JsonParser parser, DeserializationContext context)
throws IOException, JsonProcessingException {
// Do stuff
}
}
AnchorService.java
@Service
public class AnchorService {}
aktualisieren: Während meine ursprüngliche Antwort für mich wieder gearbeitet, als ich dies schrieb, @xi Die Antwort von .lin ist genau das, was benötigt wird. Schöner Fund!
Um zu klären, wie wird es bestimmt, ob eine benutzerdefinierte Verarbeitung verwendet werden soll: durch Feldnamen (effektiv) oder durch Feldtyp? –
Sorry, ich habe diesen Kommentar nicht gesehen @ProgrammerBruce .. Ich denke, nach Feldtyp .. – gc5