java中封装的jar,方法能够正常的调用,但是调用返回都没结果。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中封装的jar,方法能够正常的调用,但是调用返回都没结果。相关的知识,希望对你有一定的参考价值。

在编写这个jar代码的时候能够正常的工作,能得到我想要的值。但是封装之后给另一个程序调用就不行了。why ... ...
Fields[] fields =object.getClass().getFields();
object是一个实体对象,有值,为什么在打包之后fields这个方法没有结果。

参考技术A 把jar文件引入到你的项目中就行了了。追问

晕死~~ 我早就引用了。就是调用没有结果返回。

追答

不知道,你说的不详细了

追问

百度聊天、

参考技术B 详细一些啊~~~追问

封装的jar能够正常的用,就是没有值的返回。 也就是传进去的参数没用。

参考技术C 你的field是非public的吧? 使用getDeclaredFields追问

是public的...

GitHub Open Feign 使用总结

公司项目目前使用 SOA 架构(Service-oriented architecture:服务导向架构),每个服务作为一个单体对外提供接口,服务之间使用 GitHub OpenFeign 调用接口。

服务提供者正常提供接口,把需要暴露的接口封装为一个 client jar 包,服务调用者正常引入 jar 包,直接调用 jar 方法即可调用服务提供者接口。此文相关代码示例

Provider Api

@RestController
public class UserController {

    @PostMapping("/signin")
    public ApiResponse<Void> doSignin(@RequestParam("username") String username, @RequestParam("password") String password) {
        if (username.equals("") && password.equals("")) {
            return ApiResponse.fail(500);
        }
        return ApiResponse.success();
    }
}

Provider Client

ProviderClientBuilder

@Configuration
public class ProviderClientBuilder {
    @Value("${provider.service}")
    public String providerService;
    @Value("${provider.socketTimeout:60000}")
    public int socketTimeout;
    @Value("${provider.connectTimeout:10000}")
    public int connectTimeout;

    @Bean
    public UserApi buildProviderApi() {
        Preconditions.checkArgument(StringUtils.isNotBlank(providerService));
        return Feign.builder()
                .decoder(new GsonDecoder())
                .encoder(new FormEncoder())
                .logger(new Slf4jLogger(UserApi.class))
                .retryer(Retryer.NEVER_RETRY)
                .logLevel(Logger.Level.FULL)
                .client(new AccessTraceHttpClient(httpClient(), requestConfig()))
                .target(UserApi.class, providerService);
    }
    ...
}

UserApi

@Headers("Content-Type: application/x-www-form-urlencoded") // 请求的编码格式为 application/x-www-form-urlencoded
public interface UserApi {
    @RequestLine("POST /signin")
    public ApiResponse<Void> signin(@Param("username") String username, @Param("password") String password);

    @RequestLine("GET /status/version")
    public ApiResponse<String> statusVersion();
}

Consumer Api

@RestController
public class HomeController {
    @Autowired
    private UserApi userApi;

    @PostMapping("/signin")
    public ApiResponse<Void> signin() {
        return userApi.signin("admin","admin");
    }
}
@ComponentScan(basePackages = "wang.depp")
@SpringBootApplication
public class ConsumerApiApplication {
	public static void main(String[] args) {
		SpringApplication.run(ConsumerApiApplication.class, args);
	}
}

ProviderClientBuilder 为配置类,当 Provider 和 Consumer package 路径不同时,需要指定包扫描路径,使引入包配置类在容器启动时就加载到容器。

application.properties

server.port=8888
provider.demain=http://localhost:8080/ # 完整书写
provider.socketTimeout=60000
provider.connectTimeout=10000

pom.xml

		<dependency>
			<groupId>wang.depp</groupId>
			<artifactId>provider-client</artifactId>
			<version>1.0.6</version>
		</dependency>

踩过的坑

1、java.lang.IllegalArgumentException: target values must be absolute.

  • provider-api 的 domain 要写全;Service 参数问题,没有获取到具体数据,还为 ${*}

2、Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

  • **Api 和 Controller 方法的返回值类型对不上,比如:Api 站拦截器包装了一层 ApiResponse

3、接收参数不能为 Date

  • 因为使用 application/x-www-form-urlencoded传输时将参数链接到 URL,将转换为 String

可通过为不同环境配置不同的服务提供者 domain

以上是关于java中封装的jar,方法能够正常的调用,但是调用返回都没结果。的主要内容,如果未能解决你的问题,请参考以下文章

Oracle调用Java方法(下)复杂Jar包封装成Oracle方法以及ORA-29521错误

GitHub Open Feign 使用总结

java jar包双击不能运行

含有Swing的java项目在Eclipse中可以正常运行,但是打包后不能正常运行

Java如何将dll文件打包到jar中?

当Coldfusion从'jar'文件中调用方法时,未编译的Java程序可以正常工作,但会产生错误?