@PathVariable映射出现错误: Name for argument type

关于spring java.lang.IllegalArgumentException: Name for argument type [java.lang.String] 的错误 [url]http://blog.youkuaiyun.com/liuguanghaoputin/article/details/8695600[/url]
Name for argument type [java.lang.String] not available [url]http://m.blog.youkuaiyun.com/blog/kouwoo/42869779[/url]
SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC [url]http://jinnianshilongnian.iteye.com/blog/1705701[/url]


为了这个问题费了很大劲,主要参考了了
1.[url]http://stackoverflow.com/questions/2622018/compile-classfile-issue-in-spring-3[/url] 这个主要是因为ant编译导致类似的问题。

2. [url]http://stackoverflow.com/questions/10305592/error-class-names-are-only-accepted-if-annotation-processing-is-explicitly-req[/url] 一开始src的写法有些问题,改为上面的写法便可。


发现问题:
一次做下载过程中,使用get方式进行下载,
@ResponseBody
@RequestMapping(value = "/down/{_listid}/{type}", method = RequestMethod.GET)
public ResponseEntity<byte[]> download(@PathVariable String _listid, @PathVariable String type) throws IOException {
......
}

在idea和eclipse下面启动工程没问题, 但是部署的时候就出了问题,后台一直提示500错误,但看不到错误细节,后来我直接复制地址,打开标签,直接粘贴url,才看到下面错误:
[color=gray]org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: Name for argument type [java.lang.String] not available, and parameter name information not found in class file either.
org.springframework.web.servlet.FrameworkServlet.finalizeProcessing(FrameworkServlet.java:947)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:893)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:781)
javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:83)
com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
root cause

java.lang.IllegalArgumentException: Name for argument type [java.lang.String] not available, and parameter name information not found in class file either.
org.springframework.util.Assert.notNull(Assert.java:112)
org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.updateNamedValueInfo(AbstractNamedValueMethodArgumentResolver.java:134)
org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.getNamedValueInfo(AbstractNamedValueMethodArgumentResolver.java:112)
org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:81)
org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:75)
org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:156)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:647)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:603)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:950)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:859)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:883)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:781)
javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:83)
com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)[/color]

[b][color=red]org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: Name for argument type [java.lang.String] not available, and parameter name information not found in class file either.[/color][/b]

[color=red][b]原因:[/b][/color]
这个错误主要是因为action的参数标注默认是debug级别,比如
@RequestMapping(value = "/security/login", method = RequestMethod.POST)
public ModelAndView login(@RequestParam String userName, @RequestParam String password,
HttpServletRequest request) {

[color=red]此时userName的级别时debug级别,而在linux下编译时是忽略了这些标注,导致请求时就会找不到userName的参数。eclipse默认是debug级别的函数里面的参数名保留,但是ant编译就不行了。[/color]


[color=red][b]解决方法1:写全@RequestParam的参数 [/b][/color]
	@RequestMapping("hello")
public String helloWorld(Map<String, Object> map, HttpServletRequest request,@RequestParam(value="hhh", required = false) String hhh) {

System.out.println("hello");
System.out.println("["+hhh+"]");
map.put("message", "test message111");
return "helloView";
}

写全@PathVariable的参数
@RequestMapping(value="/users/{userId}/topics/{topicId}")
public String test(
@PathVariable(value="userId") int userId,
@PathVariable(value="topicId") int topicId)


[color=red][b]解决方法2:修改build.xml,使用javac debug=true [/b][/color]
		<javac srcdir="${src}" destdir="${build}/WEB-INF/classes" debug="true" encoding="utf-8" classpathref="classpath" includeantruntime="on">
</javac>
HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) 2025-09-02 15:54:23.531 INFO [o.s.orm.jpa.LocalContainerEntityManagerFactoryBean] - Initialized JPA EntityManagerFactory for persistence unit 'default' 2025-09-02 15:54:24.345 INFO [org.redisson.Version] - Redisson 3.37.0 2025-09-02 15:54:24.702 INFO [org.redisson.connection.ConnectionsHolder] - 1 connections initialized for 192.168.19.130/192.168.19.130:6379 2025-09-02 15:54:25.221 WARN [o.s.b.a.o.j.JpaBaseConfiguration$JpaWebConfiguration] - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 2025-09-02 15:54:25.709 INFO [n.d.b.g.s.a.GrpcServerFactoryAutoConfiguration] - Detected grpc-netty-shaded: Creating ShadedNettyGrpcServerFactory 2025-09-02 15:54:26.688 INFO [o.s.b.actuate.endpoint.web.EndpointLinksResolver] - Exposing 1 endpoint beneath base path '/actuator' 2025-09-02 15:54:26.763 INFO [n.d.b.g.s.serverfactory.AbstractGrpcServerFactory] - Registered gRPC service: com.tplink.smb.yangzhe.as.grpc.UserService, bean: userServiceGrpcImpl, class: com.tplink.smb.yangzhe.as.grpc.impl.UserServiceGrpcImpl 2025-09-02 15:54:26.763 INFO [n.d.b.g.s.serverfactory.AbstractGrpcServerFactory] - Registered gRPC service: grpc.health.v1.Health, bean: grpcHealthService, class: io.grpc.protobuf.services.HealthServiceImpl 2025-09-02 15:54:26.763 INFO [n.d.b.g.s.serverfactory.AbstractGrpcServerFactory] - Registered gRPC service: grpc.reflection.v1alpha.ServerReflection, bean: protoReflectionService, class: io.grpc.protobuf.services.ProtoReflectionService 2025-09-02 15:54:26.833 INFO [n.d.b.g.server.serverfactory.GrpcServerLifecycle] - gRPC Server started, listening on address: *, port: 9090 2025-09-02 15:54:26.842 INFO [com.tplink.smb.yangzhe.as.service.UserServiceTest] - Started UserServiceTest in 7.227 seconds (process running for 8.999) OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended org.springframework.dao.InvalidDataAccessApiUsageException: Argument '2310936065@qq.com' could not be converted to the identifier type of entity 'com.tplink.smb.yangzhe.as.model.entity.User' [Error coercing value] at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:371) at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:246) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:560) at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:343) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:160) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) at jdk.proxy1/jdk.proxy1.$Proxy148.findById(Unknown Source) at com.tplink.smb.yangzhe.as.service.impl.UserServiceImpl.getUserByEmail(UserServiceImpl.java:113) at com.tplink.smb.yangzhe.as.service.impl.UserServiceImpl.login(UserServiceImpl.java:45) at com.tplink.smb.yangzhe.as.service.UserServiceTest.testLoginSuccess(UserServiceTest.java:46) at java.base/java.lang.reflect.Method.invoke(Method.java:569) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) Caused by: java.lang.IllegalArgumentException: Argument '2310936065@qq.com' could not be converted to the identifier type of entity 'com.tplink.smb.yangzhe.as.model.entity.User' [Error coercing value] at org.hibernate.loader.internal.IdentifierLoadAccessImpl.coerceId(IdentifierLoadAccessImpl.java:235) at org.hibernate.loader.internal.IdentifierLoadAccessImpl.doLoad(IdentifierLoadAccessImpl.java:162) at org.hibernate.loader.internal.IdentifierLoadAccessImpl.lambda$load$1(IdentifierLoadAccessImpl.java:150) at org.hibernate.loader.internal.IdentifierLoadAccessImpl.perform(IdentifierLoadAccessImpl.java:113) at org.hibernate.loader.internal.IdentifierLoadAccessImpl.load(IdentifierLoadAccessImpl.java:150) at org.hibernate.internal.SessionImpl.find(SessionImpl.java:2459) at org.hibernate.internal.SessionImpl.find(SessionImpl.java:2430) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:569) at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:320) at jdk.proxy1/jdk.proxy1.$Proxy142.find(Unknown Source) at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findById(SimpleJpaRepository.java:325) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:569) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277) at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:515) at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:284) at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:752) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:174) at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:149) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:69) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) ... 11 more Caused by: org.hibernate.type.descriptor.java.CoercionException: Error coercing value at org.hibernate.type.descriptor.java.CoercionHelper.coerceWrappingError(CoercionHelper.java:396) at org.hibernate.type.descriptor.java.LongJavaType.coerce(LongJavaType.java:156) at org.hibernate.type.descriptor.java.LongJavaType.coerce(LongJavaType.java:24) at org.hibernate.loader.internal.IdentifierLoadAccessImpl.coerceId(IdentifierLoadAccessImpl.java:229) ... 45 more Caused by: java.lang.NumberFormatException: For input string: "2310936065@qq.com" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67) at java.base/java.lang.Long.parseLong(Long.java:711) at java.base/java.lang.Long.parseLong(Long.java:836) at org.hibernate.type.descriptor.java.LongJavaType.lambda$coerce$0(LongJavaType.java:157) at org.hibernate.type.descriptor.java.CoercionHelper.coerceWrappingError(CoercionHelper.java:393) ... 48 more 2025-09-02 15:54:27.488 INFO [n.d.b.g.server.serverfactory.GrpcServerLifecycle] - Completed gRPC server shutdown 2025-09-02 15:54:27.509 INFO [o.s.orm.jpa.LocalContainerEntityManagerFactoryBean] - Closing JPA EntityManagerFactory for persistence unit 'default' 2025-09-02 15:54:27.510 INFO [com.zaxxer.hikari.HikariDataSource] - HikariPool-1 - Shutdown initiated... 2025-09-02 15:54:27.518 INFO [com.zaxxer.hikari.HikariDataSource] - HikariPool-1 - Shutdown completed. Process finished with exit code -1
09-03
### Java 方法参数缺失名称的问题解决方案 当遇到 `Java method parameter name missing` 的问题时,通常是因为编译器或工具未能正确解析方法签名中的参数名。这可能发生在反编译代码、调试模式下或者某些特定的 IDE 配置中。 #### 参数名称丢失的原因 在 Java 中,默认情况下,只有通过启用 `-parameters` 编译选项才能保留方法参数的名称[^1]。如果未启用此选项,则字节码中不会保存这些参数名,从而可能导致调试困难或其他依赖于参数名的功能失效。 #### 解决方案 以下是几种常见的解决方式: 1. **启用 `-parameters` 编译选项** 在编译 Java 文件时,可以通过指定 `-parameters` 选项来让编译器记录方法参数的名称。例如,在命令行中可以这样操作: ```bash javac -parameters YourClass.java ``` 如果使用的是构建工具(如 Maven 或 Gradle),则需要调整其配置文件以包含该选项。 对于 Maven 构建项目,可以在 `pom.xml` 中添加如下配置: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <compilerArgs> <arg>-parameters</arg> </compilerArgs> </configuration> </plugin> </plugins> </build> ``` 2. **IDE 设置调整** 大多数现代 IDE 支持自动应用 `-parameters` 编译选项。对于 IntelliJ IDEA 和 Eclipse 用户来说,只需确保项目的编译器设置已开启这一功能即可。具体路径因版本而异,但一般位于项目的编译器高级设置部分。 3. **检查 API 文档生成插件** 若正在生成 Javadoc 并发现其中缺少参数描述,可能是由于未正确传递 `-parameters` 导致的结果不完整。此时应确认文档生成过程中也包含了相应的支持。 4. **处理特殊情况下的兼容性需求** 当面对旧版 JDK 或者第三方库无法满足上述条件的情况时,考虑重构代码逻辑减少对显式命名的需求;比如利用注解处理器自动生成辅助类完成映射工作。 ```java public class Example { public void process(String input) { // 正确的方法定义形式 System.out.println(input); } } ``` 以上措施能够有效应对大多数关于 “missing for type” 类型错误提示的实际应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值