小编Jan*_*Jan的帖子

在Feign RequestInterceptor / RequestTemplate中访问URITemplate或RequestLine值

我正在针对具有严格api速率限制的云应用程序开发一个应用程序。为了让我的团队感觉到我们在这些限制方面的差距,我想以有意义的方式计算从我们的应用程序发出的所有API调用。

我们使用Feign作为访问层,我希望能够使用RequestInterceptor来计算我们称为的不同API端点:

RequestInterceptor ri = rq -> addStatistics(rq.url());
Run Code Online (Sandbox Code Playgroud)

现在这行不通,因为生成的URL之后几乎总是计数为“ 1”,因为它们已经包含所有解析的路径变量,因此我得到了

1 - /something/id1valueverycryptic/get
1 - /something/anothercrypticidkey/get
Run Code Online (Sandbox Code Playgroud)

等等。

我希望以某种方式访问@ResuqestLine映射值(GET /something/{id}/get)或至少访问uri模板的pre-resolve(/somethine/{id}/get

有没有办法做到这一点?

谢谢!

java spring-boot netflix-feign

8
推荐指数
1
解决办法
287
查看次数

如何在实现接口但不扩展另一个类的Java类中引用super方法?

我有几个Java类,它们扩展了通用List接口的各种实现.它们只记录添加到List中的任何内容.

LoggingArrayList如下所示.顾名思义,它扩展了ArrayList.LoggingLinkedList类是相同的,只是它扩展了LinkedList.

我的主要目标是避免必须复制所有公共代码,以便我可以使用不同的基类.我试图尽可能地坚持DRY原则(不要重复自己).

首先,请不要建议更好的登录方式.这根本不是我的真实应用.这只是演示我遇到的问题的简单方法.

我有两个密切相关的问题.第一个是标题中的问题.如何在实现接口但不扩展另一个类的Java类中引用"超级"方法?

如下所示的LoggingArrayList类工作正常但是当我将类声明从... extends ArrayList更改为... implements List时,对super.method()的三个引用不再可调用,因此我的第一个问题.

对我的第二个问题的一个很好的答案将几乎使第一个问题没有实际意义.第二个问题是:有没有办法声明一个抽象基类,或者可能是一个扩展List的接口,使用各种add()方法的默认实现,这样我就可以简单地扩展该抽象基类或实现该接口,并且只指定什么样的List将成为具体课程的基础?

例如,我想做这样的事情:

interface LoggingList<T extends Object, L extends List<T>> extends L
{
    // overloaded methods go here as shown below 
    //  with overloaded methods declared as default for the interface
}
Run Code Online (Sandbox Code Playgroud)

...然后,我可以简单地为List的每个具体实现实现一次LoggingList,而不会复制所有公共代码.具体类可能看起来像这样,在花括号内不需要额外的代码:

public class LoggingArrayList<T extends Object> implements LoggingList<T, ArrayList<T>> {}
public class LoggingLinkedList<T extends Object> implements LoggingList<T, LinkedList<T>> {}
Run Code Online (Sandbox Code Playgroud)

问题是,我提出的接口定义是无效的(不会编译),并且,除非我使LoggingList成为抽象子类而不是接口,否则下面显示的代码中对super.method的引用是不可用的然后我回到了现在的位置.

提前感谢有关如何实现我的DRY目标的任何想法.

这是我的整个LoggingArrayList类.

public abstract class LoggingArrayList<T extends Object>
    extends ArrayList<T>
{
    protected void log(T e)
    {
        System.out.println(e == null …
Run Code Online (Sandbox Code Playgroud)

java generics inheritance design-patterns generic-collections

6
推荐指数
1
解决办法
1670
查看次数

SQL开始时间结束时间查询

所以我有这样的桌子

CREATE TABLE Table_Status
(
Status VARCHAR(10) NOT NULL,
StartTime DATETIME NOT NULL, 
EndTime DATETIME NOT NULL
); 
Run Code Online (Sandbox Code Playgroud)

数据如下所示,StartTime 和 Endtime 是连续的时间跨度

Status1 2007-10-16 18:38:25.000 2007-10-17 05:30:22.000 
Status2 2007-10-17 05:30:22.000 2007-10-17 18:48:46.000
Status2 2007-10-17 18:48:46.000 2007-10-17 21:48:46.000
Status1 2007-10-17 21:48:46.000 2007-10-18 08:11:59.000
Run Code Online (Sandbox Code Playgroud)

所以想法是在任何时间段内 SELECT *,如果用户传递两个参数

SET @From = '2007-10-17 00:00:00.000'
SET @To = '2007-10-17 23:59:59.000' 
Run Code Online (Sandbox Code Playgroud)

不知怎的,它应该返回这样的表:

Status1 2007-10-17 00:00:00.000 2007-10-17 05:30:22.000
Status2 2007-10-17 05:30:22.000 2007-10-17 21:48:46.000
Status1 2007-10-17 21:48:46.000 2007-10-17 23:59:59.000
Run Code Online (Sandbox Code Playgroud)

你看,棘手的部分是将原始时间跨度削减为用户定义的时间跨度(@From - @To),我一整天都在努力解决这个问题。请指教。

提前非常感谢!

sql sql-server

5
推荐指数
1
解决办法
2万
查看次数

无法使用HttpClient获得“ location”标头作为响应

位置标题在那里,我可以在浏览器中看到它: 在此处输入图片说明

我正在使用org.apache.httpcomponents.httpclient发送带有cookie的http请求:

```

URI uri = new URIBuilder().setScheme("https").setHost("api.weibo.com").setPath("/oauth2/authorize").setParameter("client_id","3099336849").setParameter("redirect_uri","http://45.78.24.83/authorize").setParameter("response_type", "code").build();
HttpGet req1 = new HttpGet(uri);
RequestConfig config = RequestConfig.custom().setRedirectsEnabled(false).build();
req1.setConfig(config);
req1.setHeader("Connection", "keep-alive");
req1.setHeader("Cookie", cookie);
req1.setHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36");
response = httpclient.execute(req1);
Run Code Online (Sandbox Code Playgroud)

```

我在Google上搜索了很多,并尝试启用/禁用自动重定向,但是它似乎对我不起作用。

java http apache-httpcomponents

5
推荐指数
1
解决办法
1408
查看次数

java.lang.LinkageError:违反加载程序约束:先前启动了名称为“ javax / mail / Session”的其他类型的加载

当我尝试使用发送电子邮件时,出现以下错误javax.mail-api

Caused by: java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5) previously initiated loading for a different type with name "javax/mail/Session"
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2279)
        at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1501)
        at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at com.sun.mail.util.PropUtil.getBooleanSessionProperty(PropUtil.java:86)
        at javax.mail.internet.MimeMessage.initStrict(MimeMessage.java:320)
        at javax.mail.internet.MimeMessage.<init>(MimeMessage.java:195)
        at sendEmail(manage.java:216)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:408)
        at org.apache.camel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:279)
        at org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:252)
Run Code Online (Sandbox Code Playgroud)

码:

Public void sendEmail() {
    String to = "abc@abc.com";
    String from = "efg@efg.com";
    final String username = "abc@abc.com";
    final …
Run Code Online (Sandbox Code Playgroud)

java email jakarta-mail maven

5
推荐指数
1
解决办法
1万
查看次数

为什么同一个字符通过将其大小写更改为UPPER然后更低来进行两次比较?

以下代码在java中的Class String中.我不明白为什么两个不同字符串中的字符被比较两次.首先做大写,如果失败则做小写.

我的问题是,是否需要?如果是,为什么?

  public static final Comparator<String> CASE_INSENSITIVE_ORDER
                                             = new CaseInsensitiveComparator();
        private static class CaseInsensitiveComparator
                implements Comparator<String>, java.io.Serializable {
            // use serialVersionUID from JDK 1.2.2 for interoperability
            private static final long serialVersionUID = 8575799808933029326L;

            public int compare(String s1, String s2) {
                int n1 = s1.length();
                int n2 = s2.length();
                int min = Math.min(n1, n2);
                for (int i = 0; i < min; i++) {
                    char c1 = s1.charAt(i);
                    char c2 = s2.charAt(i);
                    if (c1 != c2) {
                        c1 …
Run Code Online (Sandbox Code Playgroud)

java string unicode comparator

5
推荐指数
1
解决办法
113
查看次数

谁杀了My Java Infinite循环线程?

正如标题所示,我有一些代码包含在一个while(true)无限循环中,并且所有代码都被完全捕获trycatch阻塞.这个线程是在main方法中启动的,但是,经过长时间运行,当我使用jstack检查并导致工作累积时,这个工作线程会神秘地消失.

以下是我的代码:

public void run() {
    while (true) {
        try {
            // Consumer consumes from Kafka server
            Global.KAFKA_METRIC_DATA_CONSUMER.consume(topic, handler);
        } catch (Exception e) {
            logger.error("Kafka consumer process was interrupted by exception!");
        } finally {
            try {
                // Prevent restart too often
                Thread.sleep(30 * BaseConst.SECOND);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这个结构将保持线程运行,因此是消费者.即使consume()方法失败,它也会无限重启.但是,正如我上面提到的,整个线程无声地消失,没有任何错误日志.有人能提供一些线索吗?

一些可能有用的信息:

  1. 我已经检查过consume方法永远不会关闭使用者,也不会关闭服务器的套接字.它将在失败后不断尝试连接服务器.
  2. 我分析了java堆转储,我发现项目中的其他地方存在内存泄漏,导致内存占用非常高,gc经常出现.但是,主要方法仍在运行.

java multithreading jvm memory-management kafka-consumer-api

4
推荐指数
1
解决办法
522
查看次数

Java telnet服务器

有谁知道一个简单的telnet服务器?

我想嵌入我的应用程序并设置我自己的命令简单而不复杂.

java telnet embedded-server

3
推荐指数
1
解决办法
6732
查看次数

如何使用扫描仪 JUnit 测试方法?

我有一个类,它读取文件并使用扫描仪接收用户输入,如果扫描仪等于该文件中一行的一部分,它将显示来自同一行的字符串。

我将如何为此创建一个 Junit 测试方法?

这是我想要测试方法的一些代码:

Scanner Input = new Scanner(System.in);
    String name = Input.nextLine();

    BufferedReader br;
   try{
       br = new BufferedReader(new FileReader(new File(filename)));
       String nextLine;
       while ((nextLine = br.readLine()) != null)
       {
           if (nextLine.startsWith("||"))
           {
                int f1 = nextLine.indexOf("*");
                int f2 = nextLine.indexOf("_");
                fName = nextLine.substring(f1+1, f2);
                   if (name.equals(fname))
                   {
                        String[] s1 = nextLine.split("_");
                        String sName = s1[1];
                        System.out.println(sName);
                   }
           }
       }
Run Code Online (Sandbox Code Playgroud)

我的数据文件看起来像这样

||
*Jack_Davis
*Sophia_Harrolds
Run Code Online (Sandbox Code Playgroud)

我曾尝试在我的测试方法中使用此代码

@Test
public void testgetSurname() {
    System.out.println("get surname");
    String filename = "";
    String expResult …
Run Code Online (Sandbox Code Playgroud)

java junit java.util.scanner

3
推荐指数
1
解决办法
1万
查看次数

如何从字符串中解析时间(小时、分钟)?

有谁知道如何从看起来像 "01:20" -> 1:20AM 和 "21:20" -> 9:20PM 的字符串中解析时间(小时、分钟和 AM/PM)?大多数解决方案似乎都假设或需要 Date 或 Calendar 对象。

我的输入时间实际上来自 TimePickerDialog(特别是这个 MaterialDateTimePicker 实现,所以我只收到小时、分钟和秒(整数)。

我希望能够以友好的方式格式化用户选择的时间,即 12:30PM、02:15AM 等。

我正在尝试使用 Joda 时间:

fun formattedTime(timeStr: String): String {
    // Get time from date
    val timeFormatter = DateTimeFormat.forPattern("h:mm a")
    val displayTime = timeFormatter.parseLocalTime(timeStr)
    return displayTime.toString()
}
Run Code Online (Sandbox Code Playgroud)

但是我在输入字符串(例如“1:20”)时收到此错误: java.lang.IllegalArgumentException: Invalid format: "1:20" is too short

我也研究过SimpleDateFormat但它似乎需要一个完整的日期时间字符串,例如在这个相关问题中

java jodatime datetime-format android-jodatime

3
推荐指数
1
解决办法
4817
查看次数