小编Lea*_*ner的帖子

跨JVM或Application实例或Tomcat实例的单例

如果我在Tomcat(或任何其他服务器)的单个实例上部署并运行相同应用程序的2个实例.然后将创建一个单独的对象(Singleton类):

  1. 跨越Tomcat的单个实例(但对于同一应用程序的2个实例是常见的)或
  2. 跨应用程序实例(2个应用程序实例不同)

所以基本上我想要理解的是,每个JVM都会创建一个Singleton类的单个对象吗?如果应用程序托管在Web服务器(或容器)上,这是如何工作的.

java singleton webserver tomcat jvm

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

如何使用Jersey在REST Web服务中为服务类指定多个包名称

如何<param-value><param-name>servlet的<init-param>标记下的给定指定多个.以下是我的web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>com.vogella.jersey.first</display-name>
 <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
     <!-- Register resources and providers under com.vogella.jersey.first package. -->
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.vogella.jersey.first</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app> 
Run Code Online (Sandbox Code Playgroud)

参数jersey.config.server.provider.packages定义了Jersey将在哪个包中查找Web服务类.

我想在这里指定多个包名,因为我的服务类在不同的包中.像下面这样的东西,但它们都不起作用:

1)多个 <param-value>

<init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>com.vogella.jersey.first</param-value>
    <param-value>com.vogella.jersey.second</param-value>
</init-param>
Run Code Online (Sandbox Code Playgroud)

2)多个 <init-param>

<servlet>
    ...
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.vogella.jersey.first</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.vogella.jersey.second</param-value>
    </init-param>
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

web.xml servlets jax-rs jersey

13
推荐指数
1
解决办法
7771
查看次数

使用Parent和Child类作为参数重载的方法

我有3个班GrandParent,ParentChild,其中 Child extends ParentParent extends GrandParent

public class Main {
    void test(GrandParent gp){System.out.println("GrandParent");}
    void test(Parent p){System.out.println("Parent");}

    public static void main(String args[]){
        GrandParent obj = new Child();
        Main mainObj = new Main();
        mainObj.test(obj);  // This calls test(GrandParent gp)

        mainObj.test(new Child()); // This calss test(Parent gp)
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,2调用test()方法都用Child对象调用不同的方法.其中一个是编译时和其他运行时绑定.这对我来说听起来很奇怪.你会怎么解释这个?

java polymorphism inheritance overloading

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

从Yaml文件为Request和Response对象生成Java类

我们使用Swagger编辑器为我们的API规范创建了一个Yaml文件,其中包括基本URL,端点,请求,响应和头信息等.现在我想为这些API实现RESTful Web服务.为此,我正在考虑从这个Yaml文件生成我的Request和Response Java类,并且正在寻找某种代码生成器,最好是我可以在我的Maven项目中使用的maven插件/依赖项.我遇到了swagger,其中讨论了使用swagger-codegen Maven插件,但这是为了生成client我认为生成客户端代码以使用这些RESTful API,但是我需要生成要使用的类用于服务实施.我将使用Java和Spring框架.

我的问题是,当我们有Yaml文件(使用Swagger编辑器创建的API规范)以及可以使用哪些代码生成工具/插件时,在Java中实现RESTful Web服务的最佳实践是什么.


编辑:刚刚遇到这个服务器存根生成器HOWTO,进一步研究它.

java rest yaml web-services swagger-codegen

7
推荐指数
1
解决办法
3176
查看次数

调用存在于子类中但不存在于父类中的方法

public class Parent {
    ....
}

public class Child1 extends Parent {
    ....
    public void foo() {
        ....
    }
}

public class Child2 extends Parent {
    ....
    public void foo() {
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的方法foo()只存在于Child类中,不能添加到Parent类(甚至不是抽象方法).在这种情况下,当我想调用类的引用的foo()方法时obj,Parent我需要使用intanceof多个if..else我想避免的方法.

Parent obj = ...// Object of one of the child classes
obj.foo();
Run Code Online (Sandbox Code Playgroud)

编辑:我需要使用类型objParent唯一的.否则我将无法调用父类中存在的obj上的方法.


我的解决方案:我想的方法是定义一个接口,FooInterfacefoo()方法说,让所有子类实现它,然后我可以输入强制转换obj到该接口并调用foo()方法,如下所示:

if(obj instanceof FooInterface){
    ((FooInterface)obj).foo();
}
Run Code Online (Sandbox Code Playgroud)

有更好的方法吗?或者对这个有什么改进?

java oop class-design instanceof

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

从现有 RDS 数据库实例 (Aurora PostgreSQL) 创建 CloudFormation Yaml

我的 AWS 账户中有一个 RDS 数据库实例 (Aurora PostgreSQL) 设置。这是使用 AWS 控制台手动创建的。我现在想为该数据库创建 CloudFormation 模板 Yaml,如果需要,我可以稍后使用它来创建数据库。这也将帮助我在另一个环境中复制数据库。我还会将其用作基础设施自动化的一部分。

amazon-web-services amazon-rds aws-cloudformation amazon-aurora

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

换行章程\n给出"java.sql.SQLException:ORA-00911:无效字符\n"Oracle 11g

我有Oracle DB 11g企业版,我想通过从文件中读取sql脚本来创建表.通过java代码我正在从文件中读取sql脚本并将其存储在String sqlBlock:

CREATE SEQUENCE VerHist_SeqNum
   START WITH 1 
   INCREMENT BY 1;
CREATE TABLE VerHist
(
  SequenceNumber NUMBER(10,0)  NOT NULL,
  SQLFileName VARCHAR2(100)  NOT NULL,
  STATUS VARCHAR2(10)  NOT NULL,
  AppliedDate DATE  NOT NULL,
  DateCreated DATE 
   DEFAULT (SYSDATE),
  DateUpdated DATE 
   DEFAULT (SYSDATE),
  CONSTRAINT PK_VerHist PRIMARY KEY( SequenceNumber ),
  CONSTRAINT UC_VerHist_SQLFileNa UNIQUE( SQLFileName )
);
CREATE OR REPLACE TRIGGER VerHist_SeqNum_TRG
   BEFORE INSERT 
   ON VerHist
   FOR EACH ROW
   BEGIN
      SELECT VerHist_SeqNum.NEXTVAL INTO :NEW.SequenceNumber
        FROM DUAL;
   END;
Run Code Online (Sandbox Code Playgroud)

当我执行此查询时,它给出了

java.sql.SQLException:ORA-00911: 在Oracle的oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)的oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)处的无效字符\n .jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)at …

java sql oracle jdbc oracle11g

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

JAX-WS 客户端的默认超时

我们正在调用用于cxf-codegen-plugin从 WSDL 生成代码的Web 服务,并在 Spring xml 中配置了 JAX-WS 客户端,如下所示:

<jaxws:client id="abcApiInterface" serviceClass="abc.api.AbcApi" address="${xyz.abcApi.endpoint}" />
Run Code Online (Sandbox Code Playgroud)

我们有由 Apache CXF 3.0.3 生成的 Web 服务接口。我们在调用该服务时看到超时,我们没有在客户端指定任何超时,所以只想知道 JAX-WS 客户端超时的默认值是多少?

web-services timeout cxf jax-ws

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

@ControllerAdvice和@ExceptionHandler没有为我的RestController触发

为了在整个应用程序中实现统一的异常处理,我将REST错误处理与Spring solution#3 @ControllerAdvice一起使用,并与一起使用@ExceptionHandler

春季版本:4.3.22.RELEASE

Spring Boot版本:1.5.19.RELEASE

这是一个Spring Boot应用程序,下面是我的程序包结构。

src/main/java
  com.test.app.controller
     MyRestController.java       -- This is my Rest controller
  com.test.app.handler
     RestExceptionHandler.java   -- This is my ControllerAdvice class
Run Code Online (Sandbox Code Playgroud)

以下是我的ControllerAdvice代码,其中一个Controller引发,InvalidDataException但仍未@ExceptionHandler调用相应的控制器。相反,我Unexpected 'e'使用http 400作为响应正文。

@ControllerAdvice
public class RestExceptionHandler {

    @ExceptionHandler(InvalidDataException.class)
    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    public @ResponseBody ErrorResponse handleValidationError(final InvalidDataException ex,
                                                             final WebRequest request) {
        log.error("InvalidDataException message:{} ", ex.getMessage());
        return getExceptionResponse("Failed with Invalid data" + ex.getMessage(), HttpStatus.BAD_REQUEST.value());
    }


    private ErrorResponse getExceptionResponse(final String message, final Integer errorCode) …
Run Code Online (Sandbox Code Playgroud)

exceptionhandler spring-boot spring-restcontroller controller-advice

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

Mac OS 文件路径与 Windows 文件路径的等效文件路径

我正在建立一个使用 JBoss 的 Java 项目,该项目是为我们的项目定制的。在 JBoss 配置下的属性文件之一中,它具有各种文件的绝对路径,如下所示:

com.mycompany.abc.host.certificate=file:///c:/somedir/jboss/myproject/configuration/security/xxx/test.crt
Run Code Online (Sandbox Code Playgroud)

我正在具有 macOS Sierra 的 MacBook 上设置我的开发环境。对于相应的 Windows 路径,macOS 上的等效路径是什么,例如此文件:/Users/john/jboss/myproject/configuration/security/xxx/test.crt

linux macos window filepath

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

Spring MVC - 我可以在 RestController 中自动装配 HttpServletRequest

我可以HttpServletRequest在我的RestController类似下面自动装配吗,servletRequest即使它在高度并发的环境中执行,它也会返回不同的结果。我有一个限制,我不能作为方法参数,因为我正在实现一个自动生成的接口,不会HttpServletRequest作为方法参数。

@RestController
public class MyController implements MyInterface {
        
    @Autowired
    private HttpServletRequest servletRequest;
        
    @Override
    @RequestMapping(value = "/test", produces = {"application/json"}, consumes = {"application/json"}, method = RequestMethod.POST)
    public ResponseEntity<MyResponse> test(@RequestBody final MyRequest payload){
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我已经浏览了这些 SO 问题和其他一些关于此的文章。但只是想确保当我们HttpServletRequest在控制器中自动装配时,它的ScopeRequest

Spring 3 MVC 从控制器访问 HttpRequest

如何分配线程来处理 Servlet 请求?

Spring-Controller 的作用域及其实例变量

如何在 Spring bean 中获取 HttpServletRequest?

如何在 Java 中获取 HTTP 请求头


注意:我确实尝试过这个,它似乎工作正常。但只是想确认即使在高度并发的环境中它也是一个万无一失的解决方案。此外,如果这是正确的方法,如果有人能解释它的工作原理,我将不胜感激。

scope spring-mvc httprequest

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

Java 8 Lambda问题在递增计数时有效最终

我想在下面的场景中使用Java 8 Lambda表达式,但我得到的是在封闭范围内定义的局部变量fooCount必须是final或者有效的final.我理解的错误消息说什么,但我需要计算在这里比例,从而需要增加fooCountbarCount再计算百分比.那么实现它的方法是什么:

        // key is a String with values like "FOO;SomethinElse" and value is Long
        final Map<String, Long> map = null;
    ....
    private int calculateFooPercentage() {
        long fooCount = 0L;
        long barCount = 0L;

        map.forEach((k, v) -> {
            if (k.contains("FOO")) {
                fooCount++;
            } else {
                barCount++;
            }
        });

        final int fooPercentage = 0;
        //Rest of the logic to calculate percentage
        ....
        return fooPercentage;
    }
Run Code Online (Sandbox Code Playgroud)

我有一个选择是在AtomicLong这里使用而不是long但我想避免它,所以稍后如果可能的话我想在这里使用并行流.

java lambda final java-8

0
推荐指数
2
解决办法
1070
查看次数