如何将 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;
}
}
因为:
- @SpringBootApplication使用自动配置+组件扫描
- 你不应该用 @Component
注释 @Configuraition classes
- 你没有使用命令行参数
- 不明白尝试创建自定义转换器
我正在使用 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
:
@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;
}
}
因为:
- @SpringBootApplication使用自动配置+组件扫描
- 你不应该用 @Component 注释 @Configuraition classes
- 你没有使用命令行参数
- 不明白尝试创建自定义转换器