如何将 Spring 配置 XML 迁移到 Spring 引导注释

How to migrate Spring Config XML to Spring Boot annotations

我正在使用 Spring 引导创建用于 XML 编组的应用程序。我按照一些教程来启动应用程序。我想避免使用 xml 绑定文件的任何 Spring 配置,而是想使用注释。

我不确定如何将此配置文件迁移到注释驱动的应用程序中。

 <beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  <bean id="XMLConverter" class="com.java2s.common.XMLConverter">
    <property name="marshaller" ref="castorMarshaller" />
    <property name="unmarshaller" ref="castorMarshaller" />
  </bean>
  <bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller" />
</beans>

目前我写了这段代码:

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan
@Configuration
public class Application implements CommandLineRunner{

    private static final String XML_FILE_NAME = "whitelist.xml";

    @Autowired
    XMLConverter converter;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... arg0) throws Exception {
        Whitelist whitelist = new Whitelist("example");
        converter.convertFromObjectToXML(whitelist, XML_FILE_NAME);
    }
}

还有这个:

import javax.xml.transform.stream.StreamResult;

import org.springframework.context.annotation.Configuration;
import org.springframework.oxm.Marshaller;

@Configuration
public class XMLConverter {


    private Marshaller marshaller;

    public Marshaller getMarshaller() {
        return marshaller;
    }

    public void setMarshaller(Marshaller marshaller) {
        this.marshaller = marshaller;
    }

    public void convertFromObjectToXML(Object object, String filepath) throws IOException{

        FileOutputStream fileOutputStream = null;
        try{
            fileOutputStream = new FileOutputStream(filepath);
            getMarshaller().marshal(object, new StreamResult(fileOutputStream));
        }finally {
            if(fileOutputStream != null) {
                fileOutputStream.close();
            }
        }
    }
}

我在 getMarshaller().marshal(object, new StreamResult(fileOutputStream)); 得到了一个 Nullpointer,因为 marshaller 是空的。

在配置文件中有对 CastorMarshaller class 和编组器 属性 的引用。

如何将其迁移到注释驱动的应用程序中?

感谢您的帮助。

编辑 1:

<bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller" >
    <property name="mappingLocation" value="classpath:mapping.xml" />
</bean>

你应该把 @Autowired 放在 private Marshaller marshaller;XMLConverter class:
@Autowired private Marshaller marshaller;

首先:@Configuration 注释应该用于 class 上,它定义了应用程序上下文的 Java 配置,通常是一个单独的文件。而是用 @Component:

注释你的 classes
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan
@Component
public class Application implements CommandLineRunner{
...

此外,在您的 XML 转换器 class 中,编组器必须被注释,因此它可以与 bean 定义连接: @配置

public class XMLConverter {

    @Autowired
    private Marshaller marshaller;
...

最后你需要一个应用上下文class:

@Configuration
public class ApplicationContext {
    @Bean
    public CastorMarshaller castorMarshaller() {
        return new CastorMarshaller();
    }

    @Bean
    public XMLConverter XMLConverter() {
        XMLConverter convertor = new XMLConverter();
        CastorMarshaller marshaller = castorMarshaller();
        convertor.setMarshaller(marshaller);
        convertor.setUnmarshaller(marshaller);
    }
}

并将应用程序主要方法中的代码更改为:

SpringApplication.run(ApplicationContext .class, args);

编辑:具有映射位置的 CastorMarhsaller

   @Bean
    public CastorMarshaller castorMarshaller() {
        ClassPathContextResource resource = new ClassPathContextResource("mapping.xml", getClass().getClassLoader());
        CastorMarshaller marshaller = new CastorMarshaller();
        marshaller.setMappingLocation(resource);
        return marshaller;
    }

如果在其他地方也使用相同的资源,您可以将其定义为 bean 并以与上面所示类似的方式重用它。

以这种方式更改第一个主要 class:

@SpringBootApplication
public class Application{
    public static void main(String[] args) {
        ConfigurableApplicationContext context =
            SpringApplication.run(Application.class, args);

        XMLConverter converter = context.getBean(XMLConverter.class)
        Whitelist whitelist = new Whitelist("example");
        converter.convertFromObjectToXML(whitelist, XML_FILE_NAME);
    }

    @Bean
    public XMLConverter xmlConverter(){
        XMLConverter converter = new XMLConverter();
        CastorMarshaller castorMarshaller = new CastorMarshaller()
        converter.setMarshaller(castorMarshaller);
        converter.setUnmarshaller(castorMarshaller);
        return converter;
    }
}

因为:

  1. @SpringBootApplication使用自动配置+组件扫描
  2. 你不应该用 @Component
  3. 注释 @Configuraition classes
  4. 你没有使用命令行参数
  5. 不明白尝试创建自定义转换器