我正在尝试根据运行时类路径上可用的类来确定创建类的新实例的最佳方法.
例如,我有一个库,需要在多个类中解析JSON响应.该库具有以下界面:
JsonParser.java:
public interface JsonParser {
<T> T fromJson(String json, Class<T> type);
<T> String toJson(T object);
}
Run Code Online (Sandbox Code Playgroud)
这个类有多种实现方式,即GsonJsonParser,JacksonJsonParser,Jackson2JsonParser,目前,图书馆的用户需要"挑"及其实施基础上,他们已经包括在他们的项目,该项目库中使用.例如:
JsonParser parser = new GsonJsonParser();
SomeService service = new SomeService(parser);
Run Code Online (Sandbox Code Playgroud)
我想做的是,动态地选择哪个库在类路径上,并创建适当的实例,以便库的用户不必考虑它(甚至必须知道它的内部实现另一个类解析JSON).
我正在考虑类似于以下内容:
try {
Class.forName("com.google.gson.Gson");
return new GsonJsonParser();
} catch (ClassNotFoundException e) {
// Gson isn't on classpath, try next implementation
}
try {
Class.forName("com.fasterxml.jackson.databind.ObjectMapper");
return new Jackson2JsonParser();
} catch (ClassNotFoundException e) {
// Jackson 2 was not found, try next implementation
}
// …Run Code Online (Sandbox Code Playgroud) 我是Gradle的新手,我正在尝试本教程https://spring.io/guides/gs/rest-service/ 我能够使用所需的依赖项编译jar并运行它.但是,我发现IDE无法识别这些库很烦人.
无论如何要做到这一点?
我在 K9s 中设置了很少的上下文。我如何在它们之间切换?
例如,我在PROD上下文中,我想将上下文更改为NONPROD.
如何使用快捷方式执行此操作?
我知道你可以设置server.contextPathin application.properties来改变根上下文.
另外,我可以在Spring Boot的应用程序配置中添加一个额外的上下文,如下例(在Groovy中),为根上下文的URL映射添加"/ api":
@Bean
ServletRegistrationBean dispatcherServlet() {
ServletRegistrationBean reg = new ServletRegistrationBean(new DispatcherServlet(), "/")
reg.name = "dispatcherServlet"
reg.addInitParameter("contextConfigLocation", "")
reg.addUrlMappings("/api/*")
reg.loadOnStartup = 2
reg
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试为Web服务调用提供一个单独的基本URI"/ api",我可以利用它来保证安全性等.但是使用上述方法将意味着可以通过以下方式访问我的任何URI,无论是否使用Web服务"/"或"/ api",并没有提供具体的隔离.
是否有人知道@RestController使用配置为所有(s)设置基本路径的更好方法,而不必使用/ api /正式为每个控制器添加前缀?如果我被迫手动为每个控制器的URI添加前缀,则可能会错误地省略它并绕过我特定于Web服务的安全措施.
这是Stack Overflow中对同一类型问题的引用,该问题从未得到完全回答:
假设有以下类型:
public interface Base {
default void sayHi(){
System.out.println("hi from base");
}
}
public interface Foo extends Base {
@Override
default void sayHi(){
System.out.println("hi from foo");
}
}
public interface Bar extends Base {
}
public class MyClass implements Foo, Bar {
public static void main(String[] args) {
MyClass c = new MyClass();
c.sayHi();
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果main执行,则打印"hi from foo".为什么Foo执行优先?不Bar继承sayHi()从Base,因为如果MyClass是仅实现Bar,则Base执行将被称为?因此,代码仍然无法编译是有意义的.另外,既然Bar应该Base实现sayHi() …
在阅读Head First Design Patterns中的类适配器模式时,我遇到了这句话:
类适配器...因为你需要多个继承来实现它,这在Java中是不可能的
只是为了实验,我尝试了以下方法:
interface MyNeededInterface{
public void operationOne(MyNeededInterface other);
public MyNeededInterface operationTwo();
}
public class ThirdPartyLibraryClass{
public void thirdPartyOp();
}
Run Code Online (Sandbox Code Playgroud)
假设我创建:
class ThirdPartyWrapper extends ThirdPartyLibraryClass implements MyNeededInterface{
@Override
public void operationOne(ThirdPartyWrapper other){
this.thirdPartyOp();
dosomeExtra();
}
@Override
public ThirdPartyWrapper operationTwo(){
int somevalue = doSomeThingElse();
return new ThirdPartyWrapper(somevalue);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我可以使用:
MyNeededInterface myclass = createThirdPartyWrapper();
myclass.operationOne(someobj);
...
Run Code Online (Sandbox Code Playgroud)
这不是类适配器模式吗?
我无法弄清楚如何从给定的JAX-RS Web服务请求中检索会话ID.我认为它可用,但我不知道如何检索它.
我不使用CXF.如有任何帮助,我将不胜感激.
当我的缓存键使用@Cacheable注释在Spring中发生冲突时,我遇到了问题.例如,使用以下两种方法:
@Cacheable("doOneThing")
public void doOneThing(String name) {
// do something with name
}
@Cacheable("doAnotherThing")
public void doAnotherThing(String name) {
// do some other thing with name
}
Run Code Online (Sandbox Code Playgroud)
这是我的缓存配置,其中我添加了一个keyGenerator和一个cacheManagerbean:
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public JedisConnectionFactory redisConnectionFactory() {
return new JedisConnectionFactory();
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
redisTemplate.setConnectionFactory(cf);
return redisTemplate;
}
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
return new RedisCacheManager(redisTemplate);
}
@Bean
public KeyGenerator …Run Code Online (Sandbox Code Playgroud) 我目前在使用Cordova构建的Android应用程序时遇到问题,该应用程序的主体周围有绿框:
它似乎是由于Web容器处于焦点,因为当显示警报时绿色轮廓消失.
此绿色边框不会出现在iOS版本的应用程序中,也不会出现在浏览器中或使用时检查仿真器框架chrome://inspect.
我尝试了多个CSS修复程序来尝试删除此边框,例如:
* {
-webkit-tap-highlight-color: transparent !important;
outline: none !important;
border: 0px solid #000;
}
Run Code Online (Sandbox Code Playgroud)
以及在设备上禁用所有可访问性设置,但无济于事.
额外细节:
有谁知道如何解决这个问题?
我需要将以下 JSON 转换为 Java 对象。该物业providerResponse在JSON包含的属性的地图,但他们逃脱了,并包裹在双引号。因此,它不会将属性反序列providerResponse化为 Java 对象(它作为String)。我objectMapper.readValue(msgStr, classType)用来反序列化 JSON。该消息由 AWS 生成,用于 SNS 传送状态通知,我无法控制更改 JSON 消息。是否可以配置ObjectMapper为取消转义属性并反序列化为 Java 对象而不是String?
{
"delivery":{
"providerResponse":"{\"sqsRequestId\":\"308ee0c6-7d51-57b0-a472-af8e6c41be0b\",\"sqsMessageId\":\"88dd59eb-c34d-4e4d-bb27-7e0d226daa2a\"}"
}
}
@JsonProperty("providerResponse")
private String providerResponse;
Run Code Online (Sandbox Code Playgroud) java ×7
adapter ×1
android ×1
caching ×1
class ×1
cordova ×1
css ×1
dependencies ×1
eclipse ×1
gradle ×1
groovy ×1
interface ×1
jackson ×1
jax-rs ×1
json ×1
kubernetes ×1
request ×1
session ×1
spring ×1
spring-boot ×1
spring-cache ×1
spring-mvc ×1
web-services ×1