Request processing failed; nested exception is freemarker.core.NonStringException 异常解决

本文介绍Freemarker模板引擎中布尔型变量的正确使用方式,避免因直接输出布尔值导致的NonStringException错误,并提供解决方案。


  1. <html>  
  2.   <head>  
  3.     <meta http-equiv="content-type" content="text/html; charset=UTF-8">  
  4.     <title>freemarker基本数据类型</title>  
  5.   
  6.   </head>  
  7.     
  8.   <body>  
  9.           张三丰  
  10.        
  11.      123,456  
  12.        
  13.        
  14. Error on line 20, column 8 in type.ftl  
  15. Expecting a string, date or number here, Expression flag is instead a freemarker.template.TemplateBooleanModel$2  
  16. The problematic instruction:  
  17. ----------  
  18. ==> ${flag} [on line 20, column 6 in type.ftl]  
  19. ----------  
  20.   
  21. Java backtrace for programmers:  
  22. ----------  
  23. freemarker.core.NonStringException: Error on line 20, column 8 in type.ftl  
  24. Expecting a string, date or number here, Expression flag is instead a freemarker.template.TemplateBooleanModel$2  
  25.     at freemarker.core.Expression.getStringValue(Expression.java:126)  
  26.     at freemarker.core.Expression.getStringValue(Expression.java:93)  
  27.     at freemarker.core.DollarVariable.accept(DollarVariable.java:76)  
  28.     at freemarker.core.Environment.visit(Environment.java:221)  
  29.     at freemarker.core.MixedContent.accept(MixedContent.java:92)  
  30.     at freemarker.core.Environment.visit(Environment.java:221)  
  31.     at freemarker.core.Environment.process(Environment.java:199)  
  32.     at freemarker.template.Template.process(Template.java:259)  
  33.     at com.you.freemarker.FreemarkerTemplate.printFtl(FreemarkerTemplate.java:77)  
  34.     at com.you.test.freemarker.FreemarkerTest.studentPrint(FreemarkerTest.java:172)  
  35.     at com.you.test.freemarker.FreemarkerTest.testDataType(FreemarkerTest.java:159)  
  36.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  37.     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)  
  38.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)  
  39.     at java.lang.reflect.Method.invoke(Unknown Source)  
  40.     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)  
  41.     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)  
  42.     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)  
  43.     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)  
  44.     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)  
  45.     at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)  
  46.     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)  
  47.     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)  
  48.     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)  
  49.     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)  
  50.     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)  
  51.     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)  
  52.     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)  
  53.     at org.junit.runners.ParentRunner.run(ParentRunner.java:300)  
  54.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)  
  55.     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)  
  56.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)  
  57.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)  
  58.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)  
  59.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)  
  60. 五月 30, 2014 11:23:18 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error  
  61. 严重: Template processing error: "Error on line 20, column 8 in type.ftl\nExpecting a string, date or number here, Expression flag is instead a freemarker.template.TemplateBooleanModel$2"  
  62.   
  63. Error on line 20, column 8 in type.ftl  
  64. Expecting a string, date or number here, Expression flag is instead a freemarker.template.TemplateBooleanModel$2  
  65. The problematic instruction:  
  66. ----------  
  67. ==> ${flag} [on line 20, column 6 in type.ftl]  
  68. ----------  
  69.   
  70. Java backtrace for programmers:  
  71. ----------  
  72. freemarker.core.NonStringException: Error on line 20, column 8 in type.ftl  
  73. Expecting a string, date or number here, Expression flag is instead a freemarker.template.TemplateBooleanModel$2  
  74.     at freemarker.core.Expression.getStringValue(Expression.java:126)  
  75.     at freemarker.core.Expression.getStringValue(Expression.java:93)  
  76.     at freemarker.core.DollarVariable.accept(DollarVariable.java:76)  
  77.     at freemarker.core.Environment.visit(Environment.java:221)  
  78.     at freemarker.core.MixedContent.accept(MixedContent.java:92)  
  79.     at freemarker.core.Environment.visit(Environment.java:221)  
  80.     at freemarker.core.Environment.process(Environment.java:199)  
  81.     at freemarker.template.Template.process(Template.java:259)  
  82.     at com.you.freemarker.FreemarkerTemplate.printFtl(FreemarkerTemplate.java:77)  
  83.     at com.you.test.freemarker.FreemarkerTest.studentPrint(FreemarkerTest.java:172)  
  84.     at com.you.test.freemarker.FreemarkerTest.testDataType(FreemarkerTest.java:159)  
  85.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  86.     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)  
  87.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)  
  88.     at java.lang.reflect.Method.invoke(Unknown Source)  
  89.     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)  
  90.     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)  
  91.     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)  
  92.     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)  
  93.     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)  
  94.     at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)  
  95.     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)  
  96.     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)  
  97.     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)  
  98.     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)  
  99.     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)  
  100.     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)  
  101.     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)  
  102.     at org.junit.runners.ParentRunner.run(ParentRunner.java:300)  
  103.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)  
  104.     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)  
  105.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)  
  106.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)  
  107.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)  
  108.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)  
  109.   
  110.   
  111. Error on line 20, column 8 in type.ftl  
  112. Expecting a string, date or number here, Expression flag is instead a freemarker.template.TemplateBooleanModel$2  
  113. The problematic instruction:  
  114. ----------  
  115. ==> ${flag} [on line 20, column 6 in type.ftl]  
  116. ----------  
  117.   
  118. Java backtrace for programmers:  
  119. ----------  
  120. freemarker.core.NonStringException: Error on line 20, column 8 in type.ftl  
  121. Expecting a string, date or number here, Expression flag is instead a freemarker.template.TemplateBooleanModel$2  
  122.     at freemarker.core.Expression.getStringValue(Expression.java:126)  
  123.     at freemarker.core.Expression.getStringValue(Expression.java:93)  
  124.     at freemarker.core.DollarVariable.accept(DollarVariable.java:76)  
  125.     at freemarker.core.Environment.visit(Environment.java:221)  
  126.     at freemarker.core.MixedContent.accept(MixedContent.java:92)  
  127.     at freemarker.core.Environment.visit(Environment.java:221)  
  128.     at freemarker.core.Environment.process(Environment.java:199)  
  129.     at freemarker.template.Template.process(Template.java:259)  
  130.     at com.you.freemarker.FreemarkerTemplate.printFtl(FreemarkerTemplate.java:77)  
  131.     at com.you.test.freemarker.FreemarkerTest.studentPrint(FreemarkerTest.java:172)  
  132.     at com.you.test.freemarker.FreemarkerTest.testDataType(FreemarkerTest.java:159)  
  133.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  134.     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)  
  135.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)  
  136.     at java.lang.reflect.Method.invoke(Unknown Source)  
  137.     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)  
  138.     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)  
  139.     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)  
  140.     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)  
  141.     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)  
  142.     at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)  
  143.     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)  
  144.     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)  
  145.     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)  
  146.     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)  
  147.     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)  
  148.     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)  
  149.     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)  
  150.     at org.junit.runners.ParentRunner.run(ParentRunner.java:300)  
  151.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)  
  152.     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)  
  153.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)  
  154.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)  
  155.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)  
  156.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)  

2、错误原因

[html]  view plain  copy
 print ?
  1. <#--定义布尔值-->  
  2. <#assign flag = true/>  
  3. ${flag}  
不能直接输出除了字符串和数字之外的类型,否则会报错


3、解决办法

    将布尔类型转换为字符串输出

    将dto 中boolean 类型的isXXXX  改为getXXX


结果:true


<think>好的,用户现在遇到了HTTP 500错误,涉及到MyBatis和PersistenceException。我需要先分析这两个异常的具体原因,然后给出解决方案。 首先看引用[1]中的BeanCreationException,提到了创建entityManagerFactory失败,可能跟持久化单元根URL有关。这通常是因为Spring找不到persistence.xml或者配置不正确。用户可能使用了JPA,而配置有问题,比如数据源或者实体类路径设置不对。 然后是引用[2]的MyBatisSystemException,提示参数'number'未找到,但可用的参数是arg0、arg1等。这可能是因为MyBatis在映射参数时出了问题。用户的Mapper XML中使用了#{number}和#{password},但方法参数可能没有正确使用@Param注解,导致MyBatis无法识别参数名称,转而使用默认的arg0、arg1,从而引发绑定异常。 现在用户的问题是关于HTTP 500错误,结合这两个异常,需要分别解决MyBatis参数绑定和JPA的持久化单元问题。我需要分步骤说明可能的原因和对应的解决方法。 对于PersistenceException,可能的解决方案包括检查persistence.xml的位置是否正确,数据源配置是否正确,实体类是否被正确扫描,以及Hibernate方言是否设置正确。 对于MyBatis参数问题,需要建议用户在Mapper接口的方法参数前添加@Param注解,或者检查MyBatis的配置是否启用了useActualParamName,或者调整参数名称与XML中的占位符一致。 此外,还需要检查日志文件,查看更详细的错误信息,确保所有配置正确,依赖版本兼容,以及数据库连接正常。可能还需要示例代码来演示如何正确使用@Param注解,以及检查XML中的SQL语句是否正确。 需要确保回答结构清晰,分点说明每个异常的可能原因和解决方法,并给出示例代码。同时,根据用户的历史问题,可能需要更详细地指导如何检查配置文件和日志,确保用户能够一步步排查问题。</think>### HTTP 500错误分析及解决方案(MyBatis/PersistenceException) #### 一、问题根源定位 HTTP 500错误主要由以下两类异常引发: 1. **持久化层异常**:`BeanCreationException`表明JPA/Hibernate配置问题[^1] 2. **MyBatis参数绑定异常**:`MyBatisSystemException`提示SQL参数映射错误[^2] #### 二、分步解决方案 ##### (一)PersistenceException(JPA/Hibernate) 1. **检查实体类配置** ```java @Entity @Table(name = "user") // 确保与数据库表名匹配 public class User { @Id @Column(name = "number") // 与数据库字段对应 private String number; } ``` 2. **验证数据源配置** ```properties # application.properties spring.datasource.url=jdbc:postgresql://localhost:5432/mydb spring.datasource.username=root spring.datasource.password=secret spring.jpa.hibernate.ddl-auto=validate ``` 3. **配置持久化单元扫描路径** ```java @SpringBootApplication @EntityScan(basePackages = "com.example.entities") // 指定实体类包路径 public class Application { ... } ``` ##### (二)MyBatis参数绑定异常 1. **Mapper接口修正** ```java public interface UserMapper { User selectByNumberAndPassword( @Param("number") String number, // 添加@Param注解 @Param("password") String password ); } ``` 2. **XML映射文件验证** ```xml <select id="selectByNumberAndPassword" resultType="User"> SELECT * FROM user WHERE number = #{number,jdbcType=VARCHAR} AND password = #{password,jdbcType=VARCHAR} </select> ``` 3. **启用参数名称保留(可选)** ```properties mybatis.configuration.use-actual-param-name=true ``` #### 三、辅助排查手段 1. **日志级别调整** ```properties logging.level.org.springframework=DEBUG logging.level.org.mybatis=TRACE ``` 2. **依赖版本验证** ```xml <!-- pom.xml --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.2</version> </dependency> ``` #### 四、典型错误场景 ```java // 错误示例:未使用@Param注解 User findByCredentials(String number, String password); // 正确示例 User findByCredentials( @Param("num") String number, @Param("pwd") String password ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值