异常:Field error in object 'xxx' on field 'XXX': rejected value [2019-10-15]

1、在前端页面做添加用户时,在加载Controller的方法之前,出现以下的异常:
DEBUG [http-apr-8080-exec-2] - Failed to resolve argument 0 of type 'entity.User'
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'user' on field 'birthday': rejected value [2019-10-15]; codes [typeMismatch.user.birthday,typeMismatch.birthday,typeMismatch.java.util.Date,typeMismatch]; 
    arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.birthday,birthday]; arguments []; default message [birthday]]; 
    default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'birthday'; 
    nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2019-10-15'; 
    nested exception is java.lang.IllegalArgumentException]
	at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:157)
	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:124)
	at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:161)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:131)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:871)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:777)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:881)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
2、从异常信息中获悉,在前端日期控件输入的日期是String类型,String类型的日期无法转换成相应的Date日期格式,数据库的日期类型格式有date(年-月-日/yyyy-MM-dd)和datetime(年-月-日 时:分:秒/yyyy-MM-dd HH:mm:ss),于是检查相应的日期转换器类及在springmvc.xml配置文件中添加的配置,代码如下:
2.1 检查日期转换器类
/**
 * 日期转化器
 *      实现Converter接口
 * @Component 注解该类会作为组件类
 */
@Component
public class StringToDateConverter implements Converter<String, Date> {

    /**
     * 将String字符串转换成Date日期格式
     * @param source 字符串日期格式
     * @return Date日期格式
     */
	@Override
	public Date convert(String source) {
		/*创建Date日期对象*/
		Date date = null;

		try {
			/*判断传入的字符串日期格式是否为空*/
			if (StringUtils.isEmpty(source)) {
				/*返回为空*/
				return null;
			}

			/*转换日期格式*/
			date = new SimpleDateFormat("yyyy-MM-dd").parse(source);
		} catch (ParseException e) {
			throw new RuntimeException(e);
		}

		/*返回日期对象*/
		return date;
	}
}
2.2 检查在springmvc.xml配置文件中相应的配置
<!-- 2.开启SpringMVC注解模式 -->
<mvc:annotation-driven conversion-service="conversionService"/>

<!-- 4. 配置日期转化器工厂 -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
	<property name="converters">
		<set>
			<!--注入自定义的转换器类-->
			<ref bean="stringToDateConverter"/>
		</set>
	</property>
</bean>
2.3 检查实体类
/**
 * 用户
 */
public class User implements Serializable {
    private String id;                              /*用户编号*/
    private String userName;                            /*用户名称*/
    private String password;                        /*密码*/
    private Date birthday;                              /*出生日期*/
    private String phone;                          /*联系电话*/
    private String address;                            /*地址*/
    private String email;                          /*邮箱*/

	/*Getter与Setter方法此处省略*/

}
3、最后发现是在做添加用户信息的页面,使用日期控件输入出生日期时,设定的出生日期的日期类型为data(年-月-日/yyyy-MM-dd),那是一个字符串类型,需要进行日期格式转换
<div class="col-md-2 title">出生日期</div>
    <div class="col-md-4 data">
        <div class="input-group date">
            <div class="input-group-addon">
                <i class="fa fa-calendar"></i>
            </div>
            <input type="text" placeholder="出生日期" name="birthday" class="form-control pull-right" 
            	value="<fmt:formatDate value="${user.birthday}" pattern="yyyy-MM-dd"/>" id="birthday"/>
        </div>
    </div>
</div>
4、只需要将User实体类中birthday字段设定相应的日期格式
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 抱歉,可能是因为Pandas DataFrame对象没有`append()`方法导致的。我来尝试修复一下代码。请尝试以下代码: ```python import backtrader as bt import tushare as ts class RSI_Moving_Average(bt.Strategy): params = (('rsi_period', 14), ('ma_period', 30), ('printlog', False)) def log(self, txt, dt=None, doprint=False): if self.params.printlog or doprint: dt = dt or self.datas[0].datetime.date(0) print('%s, %s' % (dt.isoformat(), txt)) def __init__(self): self.rsi = bt.indicators.RSI_SMA(self.data.close, period=self.params.rsi_period) self.sma = bt.indicators.SimpleMovingAverage(self.data.close, period=self.params.ma_period) def next(self): if not self.position: if self.rsi < 30: self.buy() else: if self.rsi > 70: self.sell() def notify_order(self, order): if order.status in [order.Submitted, order.Accepted]: return if order.status in [order.Completed]: if order.isbuy(): self.log('BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' % (order.executed.price, order.executed.value, order.executed.comm)) else: self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' % (order.executed.price, order.executed.value, order.executed.comm)) elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log('Order Canceled/Margin/Rejected') def notify_trade(self, trade): if not trade.isclosed: return self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' % (trade.pnl, trade.pnlcomm)) if __name__ == '__main__': cerebro = bt.Cerebro() # 获取数据 data = ts.get_k_data('000001', start='2010-01-01', end='2021-01-01') data = bt.feeds.PandasData(dataname=data) cerebro.adddata(data) # 添加策略 cerebro.addstrategy(RSI_Moving_Average) # 设定初始资金和手续费 cerebro.broker.setcash(100000.0) cerebro.broker.setcommission(commission=0.002) # 运行回测 print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue()) cerebro.run() print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue()) ``` 这个策略是基于RSI和移动平均线的交叉进行交易的。当RSI低于30时,策略会买入股票,当RSI高于70时,策略会卖出股票。回测数据来自于tushare的历史数据,回测结果将会输出到控制台,包括每次交易的成本和收益。 ### 回答2: 上述代码显示AttributeError: 'DataFrame' object has no attribute 'append'。原因是DataFrame对象没有append方法。DataFrame是pandas库中的一个数据结构,用于存储和处理二维表格数据。它是由多个列组成的,并且每一列可以有不同的数据类型。 在pandas中,DataFrame对象提供了多种方法来修改和操作数据,但是没有提供append方法,因此在尝试调用append方法时会产生AttributeError错误。 如果想要将两个DataFrame对象合并成一个,可以使用concat函数或者merge函数来实现。例如,可以使用concat函数按行连接两个DataFrame对象,代码示例如下: ``` import pandas as pd df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}) df2 = pd.DataFrame({'A': [7, 8, 9], 'B': [10, 11, 12]}) df_combined = pd.concat([df1, df2], axis=0) print(df_combined) ``` 这样,df_combined将包含df1和df2按行连接后的结果。 总之,要解决上述代码显示的AttributeError错误,需要确认是否正确使用了append方法,并考虑使用其他合适的pandas方法来操作DataFrame对象。 ### 回答3: 这个错误是由于DataFrame对象在pandas库中没有append属性引起的。DataFrame对象通常用于处理二维数据,它提供了一些方法和属性用于对数据进行操作和处理。然而,DataFrame对象没有append方法可以用于在现有数据的末尾添加新的数据。 要处理这个问题,我们可以考虑以下几种解决方法: 1. 使用concat函数:我们可以使用pandas库中的concat函数来将两个DataFrame对象连接起来。例如,如果我们有两个DataFrame对象df1和df2,我们可以使用以下代码将它们连接起来:new_df = pd.concat([df1, df2])。 2. 使用append方法(针对Series对象):如果你想在DataFrame对象的某个列中添加新的数据,你可以先将新的数据转换为Series对象,然后使用DataFrame的append方法将其添加到DataFrame对象中的相应列。例如,如果我们有一个DataFrame对象df和一个Series对象s,我们可以使用以下代码将s添加到df的某个列中:df['column_name'] = df['column_name'].append(s)。 综上所述,如果你遇到了"AttributeError: 'DataFrame' object has no attribute 'append'"错误,你可以尝试使用concat函数来连接两个DataFrame对象,或者将新的数据转换为Series对象并使用DataFrame的append方法将其添加到DataFrame对象中的某个列中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值