GVKun编程网logo

NameNotFoundException:仅当尝试从Eclipse Kepler发布而不是Indigo时尝试查找“ jdbc”时

20

以上就是给各位分享Maven错误:包org.junit不存在,其中也会对maven提示包不存在进行解释,同时本文还将给你拓展eclipse–Maven错误:“更新Maven项目”、Eclipse开发M

以上就是给各位分享Maven错误:包org.junit不存在,其中也会对maven提示包不存在进行解释,同时本文还将给你拓展eclipse – Maven错误:“更新Maven项目”、Eclipse 开发 Maven 项目提示:程序包 org.junit 不存在解决方案、eclipse 环境 JUnit 测试框架(junit.framework.* 与 org.junit.*)、Error:(3, 29) java: 程序包org.junit.jupiter.api不存在等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Maven错误:包org.junit不存在(maven提示包不存在)

Maven错误:包org.junit不存在(maven提示包不存在)

我正在尝试使用maven创建javadoc,但失败。进行验证时,它也会失败。

mvn verify

我收到以下错误:

(...)    [INFO] -------------------------------------------------------------    [ERROR] COMPILATION ERROR :     [INFO] -------------------------------------------------------------    [ERROR] /home/miquel/creaveu/createOmegaMatrix/src/main/java/edu/url/salle/gtm/hnm/dataStructures/HFrame.java:[6,23]package org.junit does not exist    [ERROR] /home/miquel/creaveu/createOmegaMatrix/src/main/java/edu/url/salle/gtm/hnm/dataStructures/HFrame.java:[6,0]static import only from classes and interfaces    (···)

在我的pom.xml文件中,有以下几行:

<dependency>  <groupId>org.junit</groupId>  <artifactId>junit</artifactId>  <version>4.8.2</version>  <scope>test</scope></dependency>

我的本地存储库包含junit jar文件:

miquel@ubuntu:~/creaveu/createOmegaMatrix$ ls -l /home/miquel/.m2/repository/org/junit/junit/4.8.2/total 248**-rw-r--r-- 1 miquel miquel 237344 2012-09-13 11:01 junit-4.8.2.jar**-rw-r--r-- 1 miquel miquel    236 2012-09-13 11:13 junit-4.8.2-javadoc.jar.lastUpdated-rw-r--r-- 1 miquel miquel      0 2012-09-13 11:13 junit-4.8.2-javadoc.jar-not-available-rw-r--r-- 1 miquel miquel    458 2012-09-12 18:35 junit-4.8.2.pom-rw-r--r-- 1 miquel miquel    236 2012-09-13 11:13 junit-4.8.2-sources.jar.lastUpdated-rw-r--r-- 1 miquel miquel      0 2012-09-13 11:13 junit-4.8.2-sources.jar-not-available-rw-r--r-- 1 miquel miquel    163 2012-09-13 11:22 _maven.repositoriesmiquel@ubuntu:~/creaveu/createOmegaMatrix$

该代码很好,因为在我现在无法访问的笔记本电脑中,我运行:

mvn javadoc:javadocmvn verify

没问题,测试也可以在Eclipse IDE中使用。

答案1

小编典典

好的,您仅声明了junittest类的依赖(src/test/java位于中的main类,但是您试图在类(位于中的类中src/main/java)使用它。

要么不要在主类中使用它,要么删除它<scope>test</scope>

eclipse – Maven错误:“更新Maven项目”

eclipse – Maven错误:“更新Maven项目”

我已经使用Maven和Spring安装了Eclipse 32位EE但是当我使用Maven创建新项目时,我不断收到以下错误消息:

An internal error occurred during: "Updating Maven Project".
loader constraint violation: loader 
(instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) 
prevIoUsly initiated loading for a different type with name 
"org/apache/maven/project/MavenProject"

谢谢您的帮助

最佳答案
在Spring-Eclipse集成的某些版本组合中似乎是known problem.

升级或降级.

Eclipse 开发 Maven 项目提示:程序包 org.junit 不存在解决方案

Eclipse 开发 Maven 项目提示:程序包 org.junit 不存在解决方案

1、产生的问题:

maven 项目执行单元测试可以正常执行,但是执行 maven 命令 test,则报一下异常:

org.apache.maven.plugins:maven-compiler-plugin:2.5.1:testCompile (default-testCompile) on project support: Compilation failure: Compilation failure:
[ERROR] E:\workspace\support\src\test\java\com\test\spring\support\TestSpringContextHolder.java:[7,16] 错误: 程序包org.junit不存在
[ERROR] E:\workspace\support\src\test\java\com\test\spring\support\TestSpringContextHolder.java:[16,2] 错误: 找不到符号
[ERROR] 符号:   类 Test
[ERROR] 位置: 类 TestSpringContextHolder
[ERROR] E:\workspace\support\src\test\java\com\test\spring\support\TestSpringContextHolder.java:[29,2] 错误: 找不到符号
[ERROR] 符号:   类 Before
[ERROR] 位置: 类 TestSpringContextHolder
[ERROR] E:\workspace\support\src\test\java\com\test\spring\support\TestSpringContextHolder.java:[43,5] 错误: 找不到符号

  

2、产生上述错误的原因:

1)、maven 项目,单元测试和运行使用不同的 classpath,测试使用 test-classpath,运行使用 classpath;
2)、创建 maven 项目使用 junit 默认的版本为 3.8.1,它使用的是编程的方式,即使 maven dependencies 目录引入了 junit,但也无法使用,只能通过 build path 添加 junit 支持

<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

 

3、解决方案:

将 junit 的版本提高到 4.x,配置代码如下:

        <dependency>
            <groupId>junit</groupId> <artifactId>junit</artifactId> <!-- 默认的版本为3.8.1,修改为4.x,因为3.x使用的为编程的方式,4.x为注解的形式。 --> <version>4.11</version> <scope>test</scope> </dependency>

4、补充:我上面贴出的异常目录位于。。。\src\test\java\。。。, 不是。。。\src\main\java\。。。,处理方式如上,如果异常发生在 main 目录而不是 test 目录,同时 junit 版本是 4.x,解决方案则将 scope 属性去掉:

        <dependency>
            <groupId>junit</groupId> <artifactId>junit</artifactId> <!-- 默认的版本为3.8.1,修改为4.x,因为3.x使用的为编程的方式,4.x为注解的形式。 --> <version>4.11</version> <!-- 去掉scope作用域,使用默认的compile,编译、测试、运行都有效的作用域 --> <!--<scope>test</scope>--> </dependency>

解决思路参考:https://blog.csdn.net/javaloveiphone/article/details/52163396

eclipse 环境 JUnit 测试框架(junit.framework.* 与 org.junit.*)

eclipse 环境 JUnit 测试框架(junit.framework.* 与 org.junit.*)

如下所示,先通过 build path 导入 junit 环境依赖的 jar 包:


这里写图片描述

1. junit.framework.*

  • junit.framework.* 主要类和函数:
    • Test
    • TestCase
    • TestSuite

实现并运行(run as => Java Application,因其有 java 应用所需的入口函数:main 函数)如下的代码:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import junit.textui.TestRunner;

public class FileReaderTester extends TestCase
{
    private FileReader input = null;

    public FileReaderTester(String name)
    {
        super(name);
    }

    protected void setUp()
    {
        try
        {
            input = new FileReader("data.txt");
        } catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
    }

    public void testRead() throws IOException
    {
        char ch = ''&'';
        for (int i = 0; i < 4; ++i)
        {
            ch = (char)input.read();
        }
        assertEquals(''d'', ch);
    }

    protected void tearDown()
    {
        try
        {
            input.close();
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    public static Test suite()
    {
        TestSuite suite = new TestSuite();
        suite.addTest(new FileReaderTester("testRead"));
        return suite;
    }

    public static void main(String[] args)
    {
        TestRunner.run(suite());
    }

}

2. org.junit.*

  • 待测试的功能类的工作,不依赖任何相关的测试类;
    • 可以独立运行;
    • 测试类的对象则是待测试的功能类;
    • 测试类构造的用例是为了保证待测试的功能类能够如期望的那样运行;
    • 测试类构造用例的对象是功能类的某一成员函数

这种类库层级形式,一般是通过 eclipse 界面操作完成的:

  • 完成功能类的开发;
  • 右键此待测类:
    • new => JUnit Test Case,选择 setUp, tearDown 等上下文函数;
    • next => 勾选待测类中的待测函数;
  • eclipse 自动生成相关代码;
  • 右键 run as => Junit Test

3. references

  • 在Eclipse中使用JUnit4进行单元测试(初级篇)

Error:(3, 29) java: 程序包org.junit.jupiter.api不存在

Error:(3, 29) java: 程序包org.junit.jupiter.api不存在

 

新建的项目报错 Error:(3, 29) java: 程序包org.junit.jupiter.api不存在

 

 

 

 鼠标放在 报错的 Test 上 按住 Alt+Enter  选择 Add ...to classpath,项目会自动导入相关依赖

 

注意:需要联网才能下载!!

 

 

 

 

参考:

https://www.jianshu.com/p/96445bbe1da5

 

关于Maven错误:包org.junit不存在maven提示包不存在的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于eclipse – Maven错误:“更新Maven项目”、Eclipse 开发 Maven 项目提示:程序包 org.junit 不存在解决方案、eclipse 环境 JUnit 测试框架(junit.framework.* 与 org.junit.*)、Error:(3, 29) java: 程序包org.junit.jupiter.api不存在的相关信息,请在本站寻找。

在本文中,我们将带你了解如何使用单个命令提取UNIX文件系统中的JAR并使用JAR命令指定其目标目录?在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有效的idea打包jar包后java运行jar命令提示jar中没有主清单属性的解决方案、linux – UNIX文件系统中的粘性位是什么?什么时候使用?、linux – 使用jar命令将war解压缩到一个目录可能吗?、linux – 使用jar命令将隐藏文件包含在war文件中

本文目录一览:

如何使用单个命令提取UNIX文件系统中的JAR并使用JAR命令指定其目标目录?

如何使用单个命令提取UNIX文件系统中的JAR并使用JAR命令指定其目标目录?

我正在创建一个Python脚本,在其中执行UNIX系统命令。我有一个名为Binaries.war的战争档案,它位于名为Portal.ear的耳朵档案中

Portal耳朵文件位于/ home / foo / bar /

jar xf /home/foo/bar/Portal.ear Binaries.war

将Binaries.war文件从/home/foo/bar/Portal.ear存档中解压缩到运行脚本的当前目录中。

如何仅使用一个命令指定要提取到的目标目录?我想做这样的事情将Binaries.war提取到目录/ home / foo / bar / baz中

jar xf /home/foo/bar/Portal.ear Binaries.war [into target directory /home/foo/bar/baz]

我在JAR手册页中搜索了选项,但似乎找不到一种简单的方法来执行此操作。当然,我可以将存档解压缩到当前目录中,然后使用mv进行移动,但是我想一口气做到这一点,而不是随意整理目录和文件。

答案1

小编典典

如果您的jar文件已经具有如图所示的绝对路径名,这将特别容易:

cd /where/you/want/it; jar xf /path/to/jarfile.jar

也就是说,您将拥有由Python更改目录执行的Shell,然后运行提取。

如果您的jar文件还没有绝对路径名,那么您必须将相对名称转换为绝对名称(通过在当前目录的路径前面加上前缀),以便jar在更改目录后可以找到它。

唯一需要担心的问题是路径名中的空格之类的东西。

idea打包jar包后java运行jar命令提示jar中没有主清单属性的解决方案

idea打包jar包后java运行jar命令提示jar中没有主清单属性的解决方案

原因:  打包后的jar文件中的MANIFEST.MF缺少项目启动项,即没有Main-ClassStart-Class

解决: 看下面的截图, 操作完成后, 再重新进行intall就可以了

    

linux – UNIX文件系统中的粘性位是什么?什么时候使用?

linux – UNIX文件系统中的粘性位是什么?什么时候使用?

UNIX文件系统中的粘滞位是什么?

作为管理员何时以及如何使用它?

解决方法

它的最初用途是向OS提供一个提示,即可执行文件应该缓存在内存中,以便加载更快.这种用法大多已被弃用,因为操作系统现在对这类事情非常聪明.实际上,我认为现在一些操作系统使用它作为提示不应该缓存可执行文件.

今天最常见的用途是创建一个目录,任何人都可以在其中创建文件,但只有该目录中文件的所有者才能删除它.传统上,如果您有一个任何人都可以写入的目录,任何人都可以从中删除文件.在目录上设置粘滞位使得只有文件的所有者才能从世界可写目录中删除该文件.

经典的用法是/ tmp目录:

$ls -ld /tmp
drwxrwxrwt   29 root     root         5120 May 20 09:15 /tmp/

模式中的t是粘性位.如果没有设置,普通用户很容易通过删除/ tmp中的所有内容来造成破坏.由于许多守护进程将套接字放在/ tmp中,因此它本质上是一个本地DOS.

linux – 使用jar命令将war解压缩到一个目录可能吗?

linux – 使用jar命令将war解压缩到一个目录可能吗?

我在网上搜索一个将war文件从一个位置解压缩到另一个位置的方法,到目前为止还没什么令人满意的.
我用这个命令

jar -xvf mysite.war -C /usr/local/tomcat/webapps/mysite/

它没有用.这个:

jar -xvf mysite.war /usr/local/tomcat/webapps/mysite/

是不是没有任何错误,但仍然没有任何想法?

解决方法

找到了 blog post at mkyong.com

如上所述:“… jar没有选项将文件直接提取到另一个文件夹……”所以你需要做的就是更改到你要提取的目录,然后引用jar文件从那里

mkdir newdir
cd newdir
jar -xvf /workspace/test/classes/test.jar

这也可以在Windows上为你做到这一点,因为默认情况下unzip不可用.

linux – 使用jar命令将隐藏文件包含在war文件中

linux – 使用jar命令将隐藏文件包含在war文件中

我正在尝试在终端上的Mac OSX上创建一个war文件.我正在尝试包含一个隐藏的配置文件子目录.由于某种原因,war文件不包含hidden子目录.

我使用的命令是:

jar cvf myWar.war *

文件内容是两个html文件和一个目录“.ebextensions”

难道我做错了什么?看起来这应该比我做的更容易.

谢谢!

解决方法

尝试输入

jar cvf myWar.war *.[!.] *

使用此命令,还包括所有以点开头但排除的目录/文件.和……

关于如何使用单个命令提取UNIX文件系统中的JAR并使用JAR命令指定其目标目录?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于idea打包jar包后java运行jar命令提示jar中没有主清单属性的解决方案、linux – UNIX文件系统中的粘性位是什么?什么时候使用?、linux – 使用jar命令将war解压缩到一个目录可能吗?、linux – 使用jar命令将隐藏文件包含在war文件中等相关知识的信息别忘了在本站进行查找喔。

本文的目的是介绍在Java中,AtomicInteger compareAndSet的详细情况,特别关注和synced关键字的性能如何?的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解在Java中,AtomicInteger compareAndSet的机会,同时也不会遗漏关于AtomicBoolean中的getAndSet和compareAndSet之间的区别、AtomicIntegerArray和AtomicIntegerFieldUpdater、AtomicInteger的getAndIncrement实现、AtomicReference 的 compareAndSet 更新问题的知识。

本文目录一览:

在Java中,AtomicInteger compareAndSet()和synced关键字的性能如何?(java中synchronized关键字)

在Java中,AtomicInteger compareAndSet()和synced关键字的性能如何?(java中synchronized关键字)

我实现了请求实例的FIFO队列(为速度预先分配了请求对象),并开始在add方法上使用“
synchronized”关键字。该方法很短(检查是否在固定大小的缓冲区中有空间,然后将值添加到数组中)。使用visualVM,似乎线程阻塞的次数比我喜欢的要多(确切地说,是“监视器”)。因此,我将代码转换为将AtomicInteger值用于诸如跟踪当前大小之类的事情,然后在while循环中使用compareAndSet()(就像AtomicInteger在内部对诸如gainAndGet()之类的方法一样)。该代码现在看起来更长了。

我想知道的是,使用同步和较短的代码与不使用synced关键字的较长的代码(因此永远不要在锁上阻塞)的性能开销是多少?

这是带有synced关键字的旧get方法:

public synchronized Request get(){    if (head == tail)    {        return null;    }    Request r = requests[head];    head = (head + 1) % requests.length;    return r;}

这是不带有synced关键字的新get方法:

public Request get(){    while (true)    {        int current = size.get();        if (current <= 0)        {            return null;        }        if (size.compareAndSet(current, current - 1))        {            break;        }    }    while (true)    {        int current = head.get();        int nextHead = (current + 1) % requests.length;        if (head.compareAndSet(current, nextHead))        {            return requests[current];        }    }}

我的猜测是,由于代码较短,但由于存在锁阻塞(可能导致线程上下文切换等)的风险,所以synced关键字更糟。

谢谢!

答案1

小编典典

我的猜测是synced关键字更糟糕,因为存在阻塞锁的风险(可能导致线程上下文切换等)

是的,在通常情况下,您是对的。Java Concurrency in
Practice在15.3.2节中对此进行了讨论:

在高竞争级别上,锁定倾向于胜过原子变量,但是在更现实的竞争级别上,原子变量胜过锁定。这是因为锁通过挂起线程来对竞争做出反应,从而减少了CPU使用率和共享内存总线上的同步流量。(这类似于在生产者-消费者设计中阻止生产者如何减轻消费者的负担,从而使他们追赶。)另一方面,利用原子变量,争用管理被推回到调用类。像大多数基于CAS的算法一样,AtomicPseudoRandom通过立即重试对竞争做出反应,这通常是正确的方法,但在竞争激烈的环境中只会创造更多竞争。

Before we condemn AtomicPseudoRandom as poorly written or atomic variables
as a poor choice compared to locks, we should realize that the level of
contention in Figure 15.1 is unrealistically high: no real program does
nothing but contend for a lock or atomic variable. In practice, atomics tend
to scale better than locks because atomics deal more effectively with
typical contention levels.

锁和原子在不同争用级别之间的性能反转说明了每种锁的优缺点。竞争程度低到中等时,原子提供了更好的可伸缩性。如果争用程度较高,则锁可以更好地避免争用。(基于CAS的算法在单CPU系统上也胜过基于锁的算法,因为CAS总是在单CPU系统上成功,除非在不太可能的情况下,在读-
修改-写操作的中间抢占了线程,这种情况除外。 )

(在文本引用的图上,图15.1显示,当争用较高时,AtomicInteger和ReentrantLock的性能大致相等,而图15.2显示,在中等争用下,前者的性能要比后者高2-3倍)

更新:非阻塞算法

正如其他人指出的那样,非阻塞算法虽然可能更快,但更复杂,因此更难正确。JCiA第15.4节的提示:

良好的非阻塞算法可用于许多常见的数据结构,包括堆栈,队列,优先级队列和哈希表,尽管设计新的非阻塞算法是专家的最佳任务。

非阻塞算法比基于锁的等效算法要复杂得多。创建非阻塞算法的关键是弄清楚如何在保持数据一致性的同时将原子更改的范围限制为单个变量。在诸如队列之类的链接收集类中,有时可以将状态转换表示为对单个链接的更改,而使用AtomicReference来表示必须原子更新的每个链接,这有时是可以避免的。

AtomicBoolean中的getAndSet和compareAndSet之间的区别

AtomicBoolean中的getAndSet和compareAndSet之间的区别

线程标题应该是不言自明的…我对以下来自AtomicBoolean类的方法的规范有些困惑:

  • java.util.concurrent.atomic.AtomicBoolean#compareAndSet
  • java.util.concurrent.atomic.AtomicBoolean#getAndSet

我的追求是当用作if条件中的布尔子句时,两者将导致相同的行为:

public class Test {
  private AtomicBoolean flag = AtomicBoolean(false);

  public void processSomeAction() {
    if (flag.getAndSet(false)) { // Shouldn't this be similar to flag.compareAndSet(false)
      // process some action
    }
  }
  //...
  private void internalMutatorMethod() {
    // do some staff then update the atomic flag
    flas.set(true);
  }
}

假设我要检索当前标志值并自动更新它,这两种方法难道不会产生相同的行为吗?

如果我遗漏了内部差异,那么我将不胜感激任何有关如何以及何时使用它们的解释。

AtomicIntegerArray和AtomicIntegerFieldUpdater

AtomicIntegerArray和AtomicIntegerFieldUpdater

AtomicIntegerArray

对int数组中元素的操作不是原子性的,所以存在并发操作时,我们应该使用AtomicIntegerArray类来代替int数组。
下面是验证演示代码:

public class AtomicIntegerArrayDemo {
    static AtomicIntegerArray aiArr = new AtomicIntegerArray(5);
    static int[] intArr = new int[5];

    /**
     * 并发测试,对数组的每个元素进行递增操作
     */
    public static void main(String[] args) throws InterruptedException {
        ExecutorService threadPool = Executors.newCachedThreadPool();
        for(int t = 0; t < 5; t++) {
            threadPool.execute(() -> {
                for (int i = 0; i < 1000000; i++) {
                    aiArr.getAndIncrement(i % 5);
                }
            });

            threadPool.execute(() -> {
                for (int i = 0; i < 1000000; i++) {
                    intArr[i % 5]++;
                }
            });
        }
        threadPool.shutdown();
        boolean b = threadPool.awaitTermination(5, TimeUnit.SECONDS);
        if(b) {
            System.out.println("aiArr:" + aiArr.toString());
            System.out.println("intArr:" + Arrays.toString(intArr));
        }else{
            System.out.println("time out.");
        }
    }
}

运行结果:

D:\Java\jdk1.8.0_171\bin\java.exe "-javaagent:D:\JetBrains\IntelliJ IDEA
aiArr:[1000000, 1000000, 1000000, 1000000, 1000000]
intArr:[892703, 891096, 892369, 892372, 893754]

AtomicIntegerArray的常用方法:

//获取数组长度
int length()

//获取数组中下标为i的元素的值
int get(int i)

//设置数组中下标为i的元素的值为newValue
void set(int i, int newValue)

//设置数组中下标为i的元素的值为newValue,返回以前的值
int getAndSet(int i, int newValue)

//如果数组中下标为i的元素的值等于入参expect,则把值修改为update,并返回ture,如果不等则不修改并返回false
boolean compareAndSet(int i, int expect, int update)

// arr[i]++
int getAndIncrement(int i)

// arr[i]--
int getAndDecrement(int i)

// ++arr[i]
int incrementAndGet(int i)

// --arr[i]
 int decrementAndGet(int i)
 
//数组中下标为i的元素的值加上delta,返回以前的值
int getAndAdd(int i, int delta)

 //数组中下标为i的元素的值加上delta,返回新的值
int addAndGet(int i, int delta)

//1.8新增方法,更新当前值,返回以前的值
int getAndUpdate(int i, IntUnaryOperator updateFunction)

// 1.8新增方法,更新当前值,返回更新后的值
int updateAndGet(int i, IntUnaryOperator updateFunction)

// 1.8新增方法,更新当前值,返回以前的值
int getAndAccumulate(int i, int x, IntBinaryOperator accumulatorFunction)

// 1.8新增方法,更新当前值,返回更新后的值
int accumulateAndGet(int i, int x, IntBinaryOperator accumulatorFunction)
**
 * 1.8新增方法演示
 */
@Test
public void atomicIntegerArrayMethodTest(){
    AtomicIntegerArray arr = new AtomicIntegerArray(2);
    arr.set(0, 10);

    //lambda表达式中参数operand表示数组下标为0的元素当前值
    int i1 = arr.getAndUpdate(0, operand -> operand / 2);
    System.out.println(i1); // result: 10
    System.out.println(arr.get(0)); // result: 5

    int i2 = arr.updateAndGet(0, operand -> operand * 3);
    System.out.println(i2); // result: 15
    System.out.println(arr.get(0)); // result: 15

    //lambda表达式中参数left表示数组下标为0的元素当前值,right表示第二个参数2
    int i3 = arr.getAndAccumulate(0, 2, (left, right) -> left * right);
    System.out.println(i3); // result: 15
    System.out.println(arr.get(0)); // result: 30

    int i4 = arr.accumulateAndGet(0, 2, (left, right) -> left * right);
    System.out.println(i4); // result: 60
    System.out.println(arr.get(0)); // result: 60
}

AtomicIntegerFieldUpdater

AtomicIntegerFieldUpdater是用来原子的操作对象中int类型字段的。 下面是验证演示代码:

public class AtomicIntegerFieldUpdaterDemo {

    /**
     * 并发测试,对Counter的index字段进行递增操作
     */
    public static void main(String[] args) throws InterruptedException {
        Counter counter1 = new Counter();
        AtomicIntegerFieldUpdater<Counter> counterIndexFieldUpdater = AtomicIntegerFieldUpdater.newUpdater(Counter.class, "index");
        Counter counter2 = new Counter();
        ExecutorService threadPool = Executors.newCachedThreadPool();
        for(int t = 0; t < 5; t++) {
            threadPool.execute(() -> {
                for (int i = 0; i < 1000000; i++) {
                    counter1.index++;
                }
            });

            threadPool.execute(() -> {
                for (int i = 0; i < 1000000; i++) {
                    counterIndexFieldUpdater.getAndIncrement(counter2);
                }
            });
        }
        threadPool.shutdown();
        boolean b = threadPool.awaitTermination(5, TimeUnit.SECONDS);
        if(b) {
            System.out.println("counter1.index:" + counter1.index);
            System.out.println("counter2.index:" + counterIndexFieldUpdater.getAndIncrement(counter2));
        }else{
            System.out.println("time out.");
        }
    }
}

class Counter{
    /** 必须是volatile修饰的 */
    public volatile int index = 0;
}

运行结果:

D:\Java\jdk1.8.0_171\bin\java.exe "-javaagent:D:\JetBrains\IntelliJ IDEA 
counter1.index:4192522
counter2.index:5000000

值得注意的是,使用的时候注意如下几点:

  1. 字段必须是volatile类型的,在线程之间共享变量时保证立即可见
  2. 字段的描述类型(修饰符public/protected/default/private)是与调用者与操作对象字段的关系一致。也就是说调用者能够直接操作对象字段,那么就可以反射进行原子操作。
  3. 对于父类的字段,子类是不能直接操作的,尽管子类可以访问父类的字段。
  4. 只能是实例变量,不能是类变量,也就是说不能加static关键字。
  5. 只能是可修改变量,不能使final变量,因为final的语义就是不可修改。
  6. 对于AtomicIntegerFieldUpdater和AtomicLongFieldUpdater只能修改int/long类型的字段,不能修改其包装类型(Integer/Long)。如果要修改包装类型就需要使用AtomicReferenceFieldUpdater。
    参考:Java并发学习(九)-AtomicIntegerFieldUpdater字段原子更新类

AtomicIntegerArray的常用方法:

//创建AtomicIntegerFieldUpdater对象,tclass为需要操作对象的类型,fieldName为需要操作字段名称
static <U> AtomicIntegerFieldUpdater<U> newUpdater(Class<U> tclass, String fieldName)

//如果obj中指定字段的值等于expect,则把该字段的值设为update
boolean compareAndSet(T obj, int expect, int update) 

//把obj中指定字段的值设置为newValue
void set(T obj, int newValue);

//返回obj中指定字段的值
int get(T obj);

//把obj中指定字段的值设置为newValue,返回以前的值
int getAndSet(T obj, int newValue)

//i++
int getAndIncrement(T obj)

//++i
int incrementAndGet(T obj)

//i--
int getAndDecrement(T obj)
//--i
decrementAndGet(T obj)

//把obj中指定字段的值加上delta,返回以前的值
int getAndAdd(T obj, int delta)

//把obj中指定字段的值加上delta,返回更新后的值
int addAndGet(T obj, int delta)

//1.8新增方法,更obj中指定字段的值,返回以前的值
int getAndUpdate(T obj, IntUnaryOperator updateFunction)

//1.8新增方法,更obj中指定字段的值,返回更新后的值
int updateAndGet(T obj, IntUnaryOperator updateFunction)

//1.8新增方法,更obj中指定字段的值,返回以前的值
int getAndAccumulate(T obj, int x, IntBinaryOperator accumulatorFunction)

//1.8新增方法,更obj中指定字段的值,返回更新后的值
int accumulateAndGet(T obj, int x, IntBinaryOperator accumulatorFunction)

AtomicInteger的getAndIncrement实现

AtomicInteger的getAndIncrement实现

AtomicInteger的getAndIncrement实现执行以下操作:

public final int getAndIncrement() {    for (;;) {        int current = get(); // Step 1 , get returns the volatile variable        int next = current + 1;        if (compareAndSet(current, next))            return current;    } }

它不等于aVolatileVariable ++吗?(我们知道这是不正确的用法)。没有同步,我们如何确保此完整操作是原子的?如果在步骤1中读取了变量“
current”后,volatile变量的值发生了变化,该怎么办?

答案1

小编典典

“秘密调味料”在此调用中:

compareAndSet(current, next)

如果在读取
同时更改了原始易失性值,则该compareAndSet操作将失败(并返回false),从而迫使代码继续循环。
__

AtomicReference 的 compareAndSet 更新问题

AtomicReference 的 compareAndSet 更新问题

最近在学习 AtomicInteger 可能导致的 ABA 问题以及解决办法。

当学习到原子引用时,遇到了一个问题。不多说,开始:

一、问题代码

DEMO-1:

public class ABADemo {
    static AtomicReference<Integer> atomicReference = new AtomicReference<>(100);

    public static void main(String[] args) {
        new Thread(() -> {
            System.out.println(atomicReference.compareAndSet(100, 127));
            System.out.println(atomicReference.compareAndSet(127, 100));
            System.out.println(atomicReference.get());
        },"T1").start();
    }
}

打印结果:

可见,两次比较并更新均成功了。

DEMO-2:

public class ABADemo {
    static AtomicReference<Integer> atomicReference = new AtomicReference<>(100);

    public static void main(String[] args) {
        new Thread(() -> {
            System.out.println(atomicReference.compareAndSet(100, 128));
            System.out.println(atomicReference.compareAndSet(128, 100));
            System.out.println(atomicReference.get());
        },"T1").start();
    }
}

打印结果:

这次出现了问题:第一次更新成功,第二次更新失败。

两段代码唯一不一样的地方就是第一次更新的值,前者为 127,后者为 128。

二、原因

  1. AtomicReference.compareAndSet 通过 “==” 比较,即比较的内容是否为同一地址。

    /**
     * Atomically sets the value to the given updated value
     * if the current value {@code ==} the expected value.
     * @param expect the expected value
     * @param update the new value
     * @return {@code true} if successful. False return indicates that
     * the actual value was not equal to the expected value.
     */
    public final boolean compareAndSet(V expect, V update) {
        return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
    }

   2. 对于 java 的字面量,Java 会对其自动装箱为其包装类对象。

          int 通过 Integer.value () 方法包装成 Integer 对象,

          short 通过 Short.value () 方法包装成 Short 对象,

          long 通过 Long.value () 方法包装成 Long 对象。

    以 int 类型为例:Integer.valueOf 源码:

   /**
     * Returns an {@code Integer} instance representing the specified
     * {@code int} value.  If a new {@code Integer} instance is not
     * required, this method should generally be used in preference to
     * the constructor {@link #Integer(int)}, as this method is likely
     * to yield significantly better space and time performance by
     * caching frequently requested values.
     *
     * This method will always cache values in the range -128 to 127,
     * inclusive, and may cache other values outside of this range.
     *
     * @param  i an {@code int} value.
     * @return an {@code Integer} instance representing {@code i}.
     * @since  1.5
     */
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

    由源码可知,int 再包装为 Integer 时,如果 int 值在 - 128 到 127 之间,会直接从缓存中获取;否则会直接 new 一个新的 Integer 对象。(缓存最大值一般就是 127,有可能会通过虚拟机配置改为其他值)

    所以在我们从 100 更新为 128 时,对于 128 是 new 了一个新对象;128 再更新成 100 时,对于 128 会再 new 一个新对象。相当于两次比较并替换操作里的 128,是两个不同的对象,用 == 比较,自然是返回 false。

    所以就出现了我上面的情况。

三、short 和 long

1. short

    /**
     * Returns a {@code Short} instance representing the specified
     * {@code short} value.
     * If a new {@code Short} instance is not required, this method
     * should generally be used in preference to the constructor
     * {@link #Short(short)}, as this method is likely to yield
     * significantly better space and time performance by caching
     * frequently requested values.
     *
     * This method will always cache values in the range -128 to 127,
     * inclusive, and may cache other values outside of this range.
     *
     * @param  s a short value.
     * @return a {@code Short} instance representing {@code s}.
     * @since  1.5
     */
    public static Short valueOf(short s) {
        final int offset = 128;
        int sAsInt = s;
        if (sAsInt >= -128 && sAsInt <= 127) { // must cache
            return ShortCache.cache[sAsInt + offset];
        }
        return new Short(s);
    }

2. long 

    /**
     * Returns a {@code Long} instance representing the specified
     * {@code long} value.
     * If a new {@code Long} instance is not required, this method
     * should generally be used in preference to the constructor
     * {@link #Long(long)}, as this method is likely to yield
     * significantly better space and time performance by caching
     * frequently requested values.
     *
     * Note that unlike the {@linkplain Integer#valueOf(int)
     * corresponding method} in the {@code Integer} class, this method
     * is <em>not</em> required to cache values within a particular
     * range.
     *
     * @param  l a long value.
     * @return a {@code Long} instance representing {@code l}.
     * @since  1.5
     */
    public static Long valueOf(long l) {
        final int offset = 128;
        if (l >= -128 && l <= 127) { // will cache
            return LongCache.cache[(int)l + offset];
        }
        return new Long(l);
    }

所以对于 short 和 long 类型的 ABA 比较并替换操作,也会出现大于等于 128 时,第二次无法更新成功的问题。

今天关于在Java中,AtomicInteger compareAndSet和synced关键字的性能如何?的介绍到此结束,谢谢您的阅读,有关AtomicBoolean中的getAndSet和compareAndSet之间的区别、AtomicIntegerArray和AtomicIntegerFieldUpdater、AtomicInteger的getAndIncrement实现、AtomicReference 的 compareAndSet 更新问题等更多相关知识的信息可以在本站进行查询。

如果您对Java Background / Daemon / Service跨平台最佳实践感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于Java Background / Daemon / Service跨平台最佳实践的详细内容,我们还将为您解答java的跨平台的相关问题,并且为您提供关于.NET Core / .NET 5 中 BackgroundService 中 ServiceBase.OnCustomCommand 的等效项、Android Add Daemon Service、android setBackgroundResource setBackgroundColor setBackgroundResource区别、android – Backgrounding Phonegap以及Activity,Process和Service生命周期之间的关系的有价值信息。

本文目录一览:

Java Background / Daemon / Service跨平台最佳实践(java的跨平台)

Java Background / Daemon / Service跨平台最佳实践(java的跨平台)

我正在寻找使我的桌面Java程序在大多数平台(Windows,Mac OS,Linux [特别是Ubuntu])上在后台运行 daemon /
service
的最佳方法。

我希望通过“最佳方式”找到一种方法,该方法将:

  1. 需要 最少 数量的平台特定代码。
  2. 不需要用户做一般计算机用户不能做的任何事情
  3. 不是资源浪费。

我知道我的要求可能不切实际,但我希望这种情况有某种“最佳实践”。

如何前进?

答案1

小编典典

您可以使用
SystemTray类,并在默认平台上以其他方式安装您的应用程序。

对于Windows,它可能是在启动时运行的计划任务。对于Linux和OSX,我不知道(除了crontab
wich在某种程度上太技术化),但是我敢肯定,它们都可以轻松地做同样的事情。

不幸的是(截至今天)Apple尚未完成1.6端口。

它将不是真正的恶魔,而是像Google桌面之类的应用。

我听说Quartz是个不错的选择。但我从未使用过。

.NET Core / .NET 5 中 BackgroundService 中 ServiceBase.OnCustomCommand 的等效项

.NET Core / .NET 5 中 BackgroundService 中 ServiceBase.OnCustomCommand 的等效项

对于仍在寻找答案的任何人。请参阅 this answer on github 以获取解决方案

基本上是要注册一个自定义的 IHostLifetime 实现:

Host.CreateDefaultBuilder(args)
    .UseWindowsService()
    .ConfigureServices((hostContext,services) =>
    {
        if (WindowsServiceHelpers.IsWindowsService())
            services.AddSingleton<IHostLifetime,CustomService>();
    })

实际实现可能继承自 WindowsServiceLifetime,您可以在其中覆盖 OnCustomCommand 方法:

/// <summary>
/// Will handle custom service commands
/// </summary>
/// <param name="command">The command message sent to the service.</param>
protected override void OnCustomCommand(int command)
{
    _logger.LogInformation("Received custom service control command: {0}",command);
    switch (command)
    {
        case PreShutdownCommandCode:
            // Handle your custom command code
            break;
        default:
            base.OnCustomCommand(command);
            break;
    }
}

Android Add Daemon Service

Android Add Daemon Service

1. mkdir in /frameworks/base/cmds, such as xx_yyy

2. refer to Android.mk in other folders, such as installd, backup, etc.

caution: lib module name

3. add XX.c XX.h

4. make libmodulename

5. copy libmodulename to /system/bin/

修改init.rc后无法放入根目录

adb shell mount -o remount rw /

然后adb push init.rc /

adb reboot

android setBackgroundResource setBackgroundColor setBackgroundResource区别

android setBackgroundResource setBackgroundColor setBackgroundResource区别

 总结一下:setBackgroundResource(R.color.XXX)改变的颜色是最下层的颜色,当改变完颜色以后,因为我头部布局在xml文件中默认颜色是white,所以又给white遮盖掉了。

       xml 文件中布局默认的颜色呢,可以理解为显示在中层。当我用Resource这个方法,把颜色改变过来以后,它因为在最下层,所以直接被中层的给刷掉了,因此颜色又变了回去。

       而setBackgroundColor(context.getResouce().getColor(R.color.XXX))呢,可以理解为改变的是最上层的颜色,不管我xml布局中的颜色是什么色,我在你布局颜色上层又给刷了回去。所以就显色了。

android – Backgrounding Phonegap以及Activity,Process和Service生命周期之间的关系

android – Backgrounding Phonegap以及Activity,Process和Service生命周期之间的关系

我有一个Phonegap应用程序,我想在后台运行一些程序.也就是说,在Phonegap活动不可见时执行一些逻辑.目前,我无法编写本机服务来运行这些程序,因此我希望Phonegap Activity本身充当服务.当然,作为服务运行的逻辑是 Javascript,不能作为普通的Android服务实现.我想到的一个解决方案是通过生成“虚拟”或空服务(利用startService和startForeground)将Phonegap活动视为一种伪服务.我们的想法是,Phonegap Activity的生命周期将与服务的生命周期相关联,从而继续在后台执行Javascript代码.

无论你是否了解Phonegap,我的问题是:如果我通过在其中生成前台服务来确定流程的优先级,这是否会影响Activity生命周期?服务(及其进程)是否可能保持活动状态并且主要活动是否已从内存中清除?

如果无法保证活动生命周期受到影响,您能否说一下实践中可能发生的事情?

解决方法

One solution I’ve thought of is to treat the Phonegap Activity as a sort of pseudo-Service by spawning a “dummy” or empty Service (utilizing startService and startForeground).

如果您可以这样做,您可以在本机Java代码中实现实际服务(而不仅仅是在本机Java代码中编写空服务),您可以避免所有这些废话.

The idea is that the lifecycle of the Phonegap Activity will be tied to the lifecycle of the Service and will thus continue executing Javascript code in the background.

AFAIK,WebView既不知道也不关心流程中是否有服务.当WebView不可见时,无法保证WebView将无限期地继续执行JavaScript.而且,由于您的PhoneGap应用程序几乎只是一个WebView,因此您依赖的是这种未记录的WebView行为.

If I prioritize a process by spawning a foreground service within it,does this affect the Activity lifecycle? Is it possible that the service (and its process) stays alive and that the main Activity is cleared from memory?

欢迎用户按下BACK按钮,销毁您的活动,并且不受您是否开始某项服务的影响.

欢迎用户使用任务管理器(例如,Android 4.0上的最新任务列表)来关闭后台进程,这不受您是否启动某项服务的影响.

欢迎用户通过“设置”强制停止您的应用,以防止您的代码在未经他们许可的情况下再次运行,并且不受您是否启动某项服务的影响.

欢迎操作系统自行终止您的进程 – startForeground()不是终身传递.

总而言之,在后三种情况下,活动和服务将在此过程中同时消失.只有BACK按钮(或您的调用finish()或一些未处理的异常)才会导致活动消失但服务仍然存在.

关于Java Background / Daemon / Service跨平台最佳实践java的跨平台的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于.NET Core / .NET 5 中 BackgroundService 中 ServiceBase.OnCustomCommand 的等效项、Android Add Daemon Service、android setBackgroundResource setBackgroundColor setBackgroundResource区别、android – Backgrounding Phonegap以及Activity,Process和Service生命周期之间的关系的相关知识,请在本站寻找。

最近很多小伙伴都在问为什么Java“ String”类型用大写字母写而“ int”不是?string为什么要大写这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展@Value->无法将类型“ java.lang.String”的值转换为所需的类型“ java.lang.Integer”、asp.net – 如何处理从“DBNull”类型到“String”类型的转换无效、css – 将所有大写字母转换为init大写字母、delphi – 我应该总是使用“TList”而不是“String of String”吗?等相关知识,下面开始了哦!

本文目录一览:

为什么Java“ String”类型用大写字母写而“ int”不是?(string为什么要大写)

为什么Java“ String”类型用大写字母写而“ int”不是?(string为什么要大写)

我好奇。为什么我必须String myStr用大写字母键入而我int aNumba要用小写字母键入?

答案1

小编典典

因为int是原始类型,而不是类,所以它不能直接与进行比较String。对应的类类型是Integer根据类命名约定拼写的。

类似的原始类型和类类型对是

  • byteByte
  • shortShort
  • longLong
  • floatFloat
  • doubleDouble
  • booleanBoolean
  • charCharacter

@Value->无法将类型“ java.lang.String”的值转换为所需的类型“ java.lang.Integer”

@Value->无法将类型“ java.lang.String”的值转换为所需的类型“ java.lang.Integer”

美好的一天,我正在使用Spring 4.1.1.RELEASE开发Web应用程序。所有Spring配置都是通过注释完成的,除了以下几点之外,它可以正常工作:

  • 我在项目中有这些行的config.properties文件
        cases.caseList.filter=test    cases.caseList.numberOfCasesPerPage=50
  • 我有一个配置类
        @Configuration    @ComponentScan(basePackageClasses={CaseConfig.class})    @PropertySource(value = "classpath:config.properties")    public class CasesModuleTestContextConfig { ... }
  • 还有另一堂课
        @Component    public class HttpRequestParamsToPaginationParams extends AbstractConverter<Map<String, String>, PaginationParams> {        @Value("${cases.caseList.filter}")        private String filter;        @Value("${cases.caseList.numberOfCasesPerPage}")        private Integer count;        ...    }

已成功从属性资源注入属性“过滤器”的值。但是我在属性“ count”上遇到了一个例外:

         13:58:45.274 [main] WARN  o.s.c.s.GenericApplicationContext - Exception encountered during context initialization - cancelling refresh attempt          org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''cz.pokus.core.test.config.ConversionServiceTestConfig'': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.util.List cz.pokus.core.test.config.ConversionServiceTestConfig.converterList; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''httpRequestParamsToPaginationParams'': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.Integer cz.pokus.core.cases.converter.HttpRequestParamsToPaginationParams.count; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type ''java.lang.String'' to required type ''java.lang.Integer''; nested exception is java.lang.NumberFormatException: For input string: "${cases.caseList.numberOfCasesPerPage}"    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[spring-beans-4.1.1.RELEASE.jar:4.1.1.RELEASE]         ...         Caused by: org.springframework.beans.TypeMismatchException: Failed to convert value of type ''java.lang.String'' to required type ''java.lang.Integer''; nested exception is java.lang.NumberFormatException: For input string: "${cases.caseList.numberOfCasesPerPage}"         ...         Caused by: java.lang.NumberFormatException: For input string: "${cases.caseList.numberOfCasesPerPage}"    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_20]    at java.lang.Integer.parseInt(Integer.java:569) ~[na:1.8.0_20]    at java.lang.Integer.valueOf(Integer.java:766) ~[na:1.8.0_20]         ...

当我将属性’count’的类型更改为String时,它开始工作:

            @Value("${cases.caseList.numberOfCasesPerPage}")            private String count;

我相信当使用@Value将值从属性资源注入到Integer属性中时,Spring能够将String转换为Integer。我找到了一些人们在抱怨的情况下使用的示例。您是否有任何想法为什么对我不起作用?

非常感谢。

答案1

小编典典

如果尝试使用@Value("")注释访问属性值,则应声明PropertySourcesPlaceholderConfigurerBean。

尝试在配置类中添加以下代码段。

@Beanpublic static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {    return new PropertySourcesPlaceholderConfigurer();}

如果不想声明它,请尝试在org.springframework.core.env.Environment类中自动装配它,以获取属性值。

@Autowiredprivate Environment environment;public void readValues() {    System.out.println("Some Message:"            + environment.getProperty("<Property Name>"));}

asp.net – 如何处理从“DBNull”类型到“String”类型的转换无效

asp.net – 如何处理从“DBNull”类型到“String”类型的转换无效

我需要一些关于如何处理以下内容的建议: – 我有一个数据字段misc_text_2,其类型为varchar(25)并允许NULL.现在,如果我使用以下语法
<asp:Label ID="lblPrinter" runat="server"  Text='<%# iif(eval("misc_text_2") is dbnull.value,"",iif(eval("misc_text_2") like "NA","None",iif(eval("misc_text_2") like "KP1","Kitchen Printer 1",iif(eval("misc_text_2") like "KP2","Kitchen Printer 2",iif(eval("misc_text_2") like "KP3","Kitchen Printer 3",iif(eval("misc_text_2") like "BP1","Bar Printer 1",iif(eval("misc_text_2") like "BP2","Bar Printer 2",iif(eval("misc_text_2") like "BP3","Bar Printer 3",Eval("misc_text_2")))))))))%>'></asp:Label>

我一直在收到错误异常详细信息:system.invalidCastException:从类型’dbnull’到类型’String’的转换无效.

我知道我错过了什么,但是……

提前致谢

解决方法

你可以在你的SQL查询中使用isNull(misc_text_2,”)来返回空字符串而不是dbnull.

css – 将所有大写字母转换为init大写字母

css – 将所有大写字母转换为init大写字母

我想知道是否有任何方式只使用CSS,(这可能是浏览器特定的CSS)将所有大写文本转换为最初仅大写的单词,例如:

我和我的键盘一起玩

将被转换为:

我用我的键盘大喊大叫

编辑:我意识到我在我的问题中不够清楚,文本输入大写,而不是最初的小写,文本转换:大写不适用于像这样输入的数据.

解决方法

使用CSS进行文本转换可以做一些事情,这就是所有这些.
.Capitalize
{ text-transform: capitalize }

.Uppercase
{ text-transform: uppercase }

.Lowercase
{ text-transform: lowercase }

.nothing
{ text-transform: none }

不幸的是,没有Camel Case文本转换.

您可以始终使用Javascript来适当地转换文本,或者如果您使用的是脚本语言(如PHP或ASP),则可以在其中进行更改.

以下是从strtoupper PHP文档页面获取的示例:

function strtocamel($str,$capitalizefirst = true,$allowed = 'A-Za-z0-9') {
    return preg_replace(
        array(
            '/([A-Z][a-z])/e',// all occurances of caps followed by lowers
            '/([a-zA-Z])([a-zA-Z]*)/e',// all occurances of words w/ first char captured separately
            '/[^'.$allowed.']+/e',// all non allowed chars (non alpha numerics,by default)
            '/^([a-zA-Z])/e' // first alpha char
        ),array(
            '" ".$1',// add spaces
            'strtoupper("$1").strtolower("$2")',// capitalize first,lower the rest
            '',// delete undesired chars
            'strto'.($capitalizefirst ? 'upper' : 'lower').'("$1")' // force first char to upper or lower
        ),$str
    );
}

delphi – 我应该总是使用“TList”而不是“String of String”吗?

delphi – 我应该总是使用“TList”而不是“String of String”吗?

我一直在迁移Delphi 7中开发的项目,并且每次以前的开发人员想要使用他们创建的集合时都会查看代码:

arrayofstring : array of string;
ArrayOfInteger: array of integer;
arrayofstringArrays : array of arrayofstring;

这种代码在很多地方重复,并且每次都为它们中的每一个重复“SetLength”,我想知道是否将所有这些东西的数组改为TList< Something>现在我们在Delphi XE4.

这样做有什么好处,资源,速度或类似的东西来支持我做出这个决定?

PS:我来自JAVA和Delphi给我感到黑暗和充满恐惧

解决方法

将动态数组视为比TStringList或TList< T>更低级别的构造.

动态数组通过指针提供对元素的直接访问.该语言隐藏了指针,但这基本上都是动态数组.但是你负责任何重新分配,如果你想插入或删除项目,那么你必须编写代码,并处理细节.

更高级别的集合类TStringList和TList< T>建立在动态数组之上.这是内部如何存储内容.但是集合类为你包装了这个.作为方法提供了诸如插入和删除等更高级别的操作.实质上,这些集合类比原始动态数组提供了更多的便利.

为了说明,请考虑插入项目的行为.对于动态数组,您可以这样做:

>调整阵列大小.
>将插入点之后的项目从位置i移动到i 1.
>分配插入的项目.

如果您不止一次需要编写此代码,那么,您做错了.

对于您写的高级集合:

List.Insert(Index,Value);

让班级来处理细节.

请注意,由于历史原因,并且因为字符串特别重要,开发人员倾向于使用定制的专用TStringList类而不是TList< string>.专用类再次提供TList< string>之外的功能.因为它专门研究字符串,并且可以提供定制到字符串的功能.同样,专用课程提供了便利.

动态阵列派上用场的一个地方就是当你不想招致终身管理的样板时.因此,对于没有针对类的ARC的桌面编译器,您需要明确地销毁TList< T>.实例.但动态阵列的生命周期由ARC管理.如果您一次性合成数组,然后不调整它们的大小,那么生命周期管理问题可以使数组更方便使用.

根据经验,喜欢高级集合类.它们应该是您的默认选择.有时动态数组是正确的选择,但这往往适用于更专业的场景.

今天关于为什么Java“ String”类型用大写字母写而“ int”不是?string为什么要大写的讲解已经结束,谢谢您的阅读,如果想了解更多关于@Value->无法将类型“ java.lang.String”的值转换为所需的类型“ java.lang.Integer”、asp.net – 如何处理从“DBNull”类型到“String”类型的转换无效、css – 将所有大写字母转换为init大写字母、delphi – 我应该总是使用“TList”而不是“String of String”吗?的相关知识,请在本站搜索。

在本文中,您将会了解到关于当我们需要多个EntityManager时?的新资讯,并给出一些关于com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder的实例源码、com.amazonaws.services.identitymanagement.AmazonIdentityManagementClient的实例源码、com.amazonaws.services.identitymanagement.AmazonIdentityManagement的实例源码、EJB之JPA(EntityManager)的实用技巧。

本文目录一览:

当我们需要多个EntityManager时?

当我们需要多个EntityManager时?

我正在学习JPA,有一个问题:

在哪些情况下EntityManager,我们的应用程序需要多个?

我知道的两种情况如下:

  • 当我们的应用程序是多线程应用程序并且一个以上的线程需要JPA事务时,因为EntityManager它不是线程安全的,因此EntityManager每个线程需要一个线程。

  • 当任何一个线程需要多个并发事务时,EntityManager由于EntityManager和之间存在一对一的关系,因此在该线程中我们需要多个EntityTransaction


Q1。当我们需要多个条件时,还有其他情况EntityManager吗?

Q2。据我了解,EntityManagerFactory每个Percentnce Unit
只能有一个。我对么?如果不是,那么当我们需要多个EntityManagerFactory持久性单元时会发生什么情况?

答案1

小编典典

问题1:EntityManager最好将其与“好旧的”休眠模式进行比较Session:一个工作单元(一种简单的业务操作,例如“登录用户”,“下订单”等)。它不一定要绑定到单个线程。如果不同的线程执行在单个工作单元中相互依赖的数据库任务,您只会遇到麻烦。您将需要同步执行它们(最好是在单个线程中顺序执行)。例如,如果您有在用户登录时清理一些“旧日志”的业务要求(这在合理范围内不会干扰彼此的信息),则可以在一个工作单元内的两个单独的线程中完美地执行它。

问题2:您的理解是正确的。但是,您可以创建多个应用程序,但这没有任何意义,也没有任何好处。这只会增加大量开销。

com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder的实例源码

com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder的实例源码

项目:cyberduck    文件:AmazonIdentityConfiguration.java   
private AmazonIdentityManagement client() {
    return AmazonIdentityManagementClientBuilder.standard()
            .withCredentials(new AWsstaticCredentialsProvider(new AWSCredentials() {
                @Override
                public String getAWSAccessKeyId() {
                    return bookmark.getCredentials().getUsername();
                }

                @Override
                public String getAWSSecretKey() {
                    return bookmark.getCredentials().getpassword();
                }
            }))
            .withClientConfiguration(configuration)
            .withRegion(Regions.DEFAULT_REGION).build();
}
项目:Sqawsh    文件:CognitoCustomresourceLambda.java   
void addRolesToIdentityPool(String unauthenticatedRoleName,String unauthenticatedRole,String authenticatedRoleName,String authenticatedRole,String identityPoolId,AmazonCognitoIdentity client,LambdaLogger logger) {
  // First update the roles to use the actual pool id in their conditions
  logger
      .log("Updating authenticated and unauthenticated roles to use the actual identity pool id: "
          + identityPoolId);
  AmazonIdentityManagement iamClient = AmazonIdentityManagementClientBuilder.standard().build();
  UpdateAssumeRolePolicyRequest updateAssumeRolePolicyRequest = new UpdateAssumeRolePolicyRequest();
  updateAssumeRolePolicyRequest.setRoleName(unauthenticatedRoleName);
  updateAssumeRolePolicyRequest.setPolicyDocument(getAssumeRolePolicyDocument(false,identityPoolId,logger));
  iamClient.updateAssumeRolePolicy(updateAssumeRolePolicyRequest);
  updateAssumeRolePolicyRequest.setRoleName(authenticatedRoleName);
  updateAssumeRolePolicyRequest.setPolicyDocument(getAssumeRolePolicyDocument(true,logger));
  iamClient.updateAssumeRolePolicy(updateAssumeRolePolicyRequest);

  // And add the updated roles to the pool
  logger.log("Adding updated authenticated and unauthenticated roles to the identity pool");
  SetIdentityPoolRolesRequest setIdentityPoolRolesRequest = new SetIdentityPoolRolesRequest();
  setIdentityPoolRolesRequest.addRolesEntry("authenticated",authenticatedRole);
  setIdentityPoolRolesRequest.addRolesEntry("unauthenticated",unauthenticatedRole);
  setIdentityPoolRolesRequest.setIdentityPoolId(identityPoolId);
  client.setIdentityPoolRoles(setIdentityPoolRolesRequest);
}
项目:aws-doc-sdk-examples    文件:createuser.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a username\n" +
            "Ex: createuser <username>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String username = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        createuserRequest request = new createuserRequest()
            .withUserName(username);

        createuserResult response = iam.createuser(request);

        System.out.println("Successfully created user: " +
                response.getUser().getUserName());
    }
项目:aws-doc-sdk-examples    文件:GetServerCertificate.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a certificate name\n" +
            "Ex: GetServerCertificate <certificate-name>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String cert_name = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        GetServerCertificateRequest request = new GetServerCertificateRequest()
                    .withServerCertificateName(cert_name);

        GetServerCertificateResult response = iam.getServerCertificate(request);

        System.out.format("Successfully retrieved certificate with body %s",response.getServerCertificate().getCertificateBody());
    }
项目:aws-doc-sdk-examples    文件:GetPolicy.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a policy arn\n" +
            "Ex: GetPolicy <policy-arn>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String policy_arn = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        GetPolicyRequest request = new GetPolicyRequest()
            .withPolicyArn(policy_arn);

        GetPolicyResult response = iam.getPolicy(request);

        System.out.format("Successfully retrieved policy %s",response.getPolicy().getPolicyName());
    }
项目:aws-doc-sdk-examples    文件:DeleteServerCertificate.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a certificate name\n" +
            "Ex: DeleteServerCertificate <certificate-name>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String cert_name = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        DeleteServerCertificateRequest request =
            new DeleteServerCertificateRequest()
                .withServerCertificateName(cert_name);

        DeleteServerCertificateResult response =
            iam.deleteServerCertificate(request);

        System.out.println("Successfully deleted server certificate " +
                cert_name);
    }
项目:aws-doc-sdk-examples    文件:DetachRolePolicy.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a role name and policy arn\n" +
            "Ex: DetachRolePolicy <role-name> <policy-arn>>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String role_name = args[0];
        String policy_arn = args[1];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        DetachRolePolicyRequest request = new DetachRolePolicyRequest()
            .withRoleName(role_name)
            .withPolicyArn(policy_arn);

        DetachRolePolicyResult response = iam.detachRolePolicy(request);

        System.out.println("Successfully detached policy " + policy_arn +
                " from role " + role_name);
    }
项目:aws-doc-sdk-examples    文件:DeleteAccountAlias.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply an account alias\n" +
            "Ex: DeleteAccountAlias <account-alias>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String alias = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        DeleteAccountAliasRequest request = new DeleteAccountAliasRequest()
            .withAccountAlias(alias);

        DeleteAccountAliasResult response = iam.deleteAccountAlias(request);

        System.out.println("Successfully deleted account alias " + alias);
    }
项目:aws-doc-sdk-examples    文件:ListUsers.java   
public static void main(String[] args) {

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        boolean done = false;
        ListUsersRequest request = new ListUsersRequest();

        while(!done) {
            ListUsersResult response = iam.listUsers(request);

            for(User user : response.getUsers()) {
                System.out.format("Retrieved user %s",user.getUserName());
            }

            request.setMarker(response.getMarker());

            if(!response.getIsTruncated()) {
                done = true;
            }
        }
    }
项目:aws-doc-sdk-examples    文件:CreateAccessKey.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply an IAM user\n" +
            "Ex: CreateAccessKey <user>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String user = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        CreateAccessKeyRequest request = new CreateAccessKeyRequest()
            .withUserName(user);

        CreateAccessKeyResult response = iam.createAccessKey(request);

        System.out.println("Created access key: " + response.getAccessKey());
    }
项目:aws-doc-sdk-examples    文件:AccessKeyLastUsed.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply an access key id\n" +
            "Ex: AccessKeyLastUsed <access-key-id>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String access_id = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        GetAccessKeyLastUsedRequest request = new GetAccessKeyLastUsedRequest()
            .withAccessKeyId(access_id);

        GetAccessKeyLastUsedResult response = iam.getAccessKeyLastUsed(request);

        System.out.println("Access key was last used at: " +
                response.getAccessKeyLastUsed().getLastUsedDate());
    }
项目:aws-doc-sdk-examples    文件:CreatePolicy.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a policy name\n" +
            "Ex: CreatePolicy <policy-name>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String policy_name = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        CreatePolicyRequest request = new CreatePolicyRequest()
            .withPolicyName(policy_name)
            .withPolicyDocument(POLICY_DOCUMENT);

        CreatePolicyResult response = iam.createPolicy(request);

        System.out.println("Successfully created policy: " +
                response.getPolicy().getPolicyName());
    }
项目:aws-doc-sdk-examples    文件:DeleteAccessKey.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a username and access key id\n" +
            "Ex: DeleteAccessKey <username> <access-key-id>\n";

        if (args.length != 2) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String username = args[0];
        String access_key = args[1];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        DeleteAccessKeyRequest request = new DeleteAccessKeyRequest()
            .withAccessKeyId(access_key)
            .withUserName(username);

        DeleteAccessKeyResult response = iam.deleteAccessKey(request);

        System.out.println("Successfully deleted access key " + access_key +
                " from user " + username);
    }
项目:aws-doc-sdk-examples    文件:CreateAccountAlias.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply an alias\n" +
            "Ex: CreateAccountAlias <alias>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String alias = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        CreateAccountAliasRequest request = new CreateAccountAliasRequest()
            .withAccountAlias(alias);

        CreateAccountAliasResult response = iam.createAccountAlias(request);

        System.out.println("Successfully created account alias: " + alias);
    }
项目:aws-maven-plugin    文件:AwsPropertyMojo.java   
@Override
public void execute() throws MojoExecutionException,MojoFailureException {
    Proxy proxy = new Proxy(httpsProxyHost,httpsProxyPort,httpsProxyUsername,httpsProxyPassword);
    AwsKeyPair keyPair = Util.getAwsKeyPair(serverId,awsAccessKey,awsSecretAccessKey,settings,decrypter);
    final AWSCredentialsProvider credentials = new AWsstaticCredentialsProvider(
            new BasicAWSCredentials(keyPair.key,keyPair.secret));
    ClientConfiguration cc = Util.createConfiguration(proxy);

    AmazonIdentityManagement iam = AmazonIdentityManagementClientBuilder //
            .standard() //
            .withRegion(region) //
            .withCredentials(credentials) //
            .withClientConfiguration(cc) //
            .build();
    String accountId = iam.getUser().getUser().getUserId();
    project.getProperties().setProperty("aws.account.id",accountId);
    getLog().info("The following properties have been set for the project");
    getLog().info("aws.account.id=" + accountId);
}
项目:strongBox    文件:PrincipalAutoSuggestion.java   
public static PrincipalAutoSuggestion fromCredentials(AWSCredentialsProvider awsCredentials,ClientConfiguration clientConfiguration) {

        AmazonIdentityManagement client = AmazonIdentityManagementClientBuilder.standard()
                .withCredentials(awsCredentials)
                .withClientConfiguration(transformAndVerifyOrThrow(clientConfiguration))
                .withRegion(RegionResolver.getRegion())
                .build();

        return new PrincipalAutoSuggestion(client);
    }
项目:strongBox    文件:IAMPolicyManager.java   
public static IAMPolicyManager fromCredentials(AWSCredentialsProvider awsCredentials,ClientConfiguration clientConfiguration) {
    AmazonIdentityManagement client = AmazonIdentityManagementClientBuilder.standard()
        .withCredentials(awsCredentials)
        .withClientConfiguration(transformAndVerifyOrThrow(clientConfiguration))
        .withRegion(RegionResolver.getRegion())
        .build();
    return new IAMPolicyManager(client,awsCredentials,clientConfiguration);
}
项目:strongBox    文件:IntegrationTestHelper.java   
private static void cleanUpIAM(Regions testRegion,String testResourcePrefix,Date createdBeforeThreshold,AWSCredentialsProvider awsCredentials) {
    AmazonIdentityManagement iamClient = AmazonIdentityManagementClientBuilder.standard()
        .withCredentials(awsCredentials)
        .withRegion(testRegion)
        .build();
    IAMPolicyManager iamPolicyManager = IAMPolicyManager.fromCredentials(awsCredentials,new ClientConfiguration());

    LOG.info("Cleaning IAM policies...");
    ListPoliciesRequest listPoliciesRequest = new ListPoliciesRequest().withPathPrefix(IAMPolicyManager.PATH_PREFIX);
    List<Policy> policies = iamClient.listPolicies(listPoliciesRequest).getPolicies();
    for (Policy policy: policies) {
        if (policy.getPolicyName().startsWith(testResourcePrefix) &&
                policy.getCreateDate().before(createdBeforeThreshold)) {
            LOG.info("Cleaning up policy: " + policy.getPolicyName());

            IAMPolicyName iamPolicyName = IAMPolicyName.fromString(policy.getPolicyName());
            iamPolicyManager.detachAllPrincipals(iamPolicyName.group);

            DeletePolicyRequest deletePolicyRequest = new DeletePolicyRequest().withPolicyArn(policy.getArn());
            iamClient.deletePolicy(deletePolicyRequest);
        }
    }

    LOG.info("Cleaning IAM roles created for the assume role tests...");
    ListRolesRequest listRolesRequest = new ListRolesRequest().withPathPrefix(IAMHelper.PATH);
    List<Role> roles = iamClient.listRoles(listRolesRequest).getRoles();
    for (Role role: roles) {
        if (role.getRoleName().startsWith(AssumedRoleTestContext.ROLE_PREFIX) &&
                role.getCreateDate().before(createdBeforeThreshold)) {
            LOG.info("Cleaning up role: " + role.getRoleName());
            DeleteRoleRequest deleteRoleRequest = new DeleteRoleRequest().withRoleName(role.getRoleName());
            iamClient.deleteRole(deleteRoleRequest);
        }
    }

}
项目:photon-model    文件:AWSEndpointAdapterService.java   
/**
 * Method gets the aws accountId from the specified credentials.
 *
 * @param privateKeyId
 * @param privateKey
 * @return account ID
 */
private String getAccountId(String privateKeyId,String privateKey) {
    AWSCredentials awsCredentials = new BasicAWSCredentials(privateKeyId,privateKey);

    AWsstaticCredentialsProvider awsstaticCredentialsProvider = new AWsstaticCredentialsProvider(
            awsCredentials);

    AmazonIdentityManagementClientBuilder amazonIdentityManagementClientBuilder = AmazonIdentityManagementClientBuilder
            .standard()
            .withCredentials(awsstaticCredentialsProvider)
            .withRegion(Regions.DEFAULT_REGION);

    AmazonIdentityManagementClient iamClient = (AmazonIdentityManagementClient) amazonIdentityManagementClientBuilder
            .build();

    String userId = null;
    try {
        if ((iamClient.getUser() != null) && (iamClient.getUser().getUser() != null)
                && (iamClient.getUser().getUser().getArn() != null)) {

            String arn = iamClient.getUser().getUser().getArn();
            /*
             * arn:aws:service:region:account:resource -> so limiting the split to 6 words and
             * extracting the accountId which is 5th one in list. If the user is not authorized
             * to perform iam:GetUser on that resource,still error mesage will have accountId
             */
            userId = arn.split(":",6)[4];
        }
    } catch (AmazonServiceException ex) {
        if (ex.getErrorCode().compareto("AccessDenied") == 0) {
            String msg = ex.getMessage();
            userId = msg.split(":",7)[5];
        } else {
            logSevere("Exception getting the accountId %s",ex);

        }
    }
    return userId;
}
项目:aws-ec2-ssh    文件:AAWSTest.java   
public AAWStest() {
    super();
    if (Config.has(Config.Key.IAM_ROLE_ARN)) {
        final AWSSecurityTokenService sts = AWSSecurityTokenServiceClientBuilder.standard().withCredentials(new DefaultAWSCredentialsProviderChain()).build();
        this.credentialsProvider = new STSAssumeRoleSessionCredentialsProvider.Builder(Config.get(Config.Key.IAM_ROLE_ARN),IAM_SESSION_NAME).withStsClient(sts).build();
    } else {
        this.credentialsProvider = new DefaultAWSCredentialsProviderChain();
    }
    this.ec2 = AmazonEC2ClientBuilder.standard().withCredentials(this.credentialsProvider).build();
    this.iam = AmazonIdentityManagementClientBuilder.standard().withCredentials(this.credentialsProvider).build();
}
项目:aws-doc-sdk-examples    文件:ListAccessKeys.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply an IAM  username\n" +
            "Ex: ListAccessKeys <username>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String username = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        boolean done = false;
        ListAccessKeysRequest request = new ListAccessKeysRequest()
                .withUserName(username);

        while (!done) {

            ListAccessKeysResult response = iam.listAccessKeys(request);

            for (AccessKeyMetadata Metadata :
                    response.getAccessKeyMetadata()) {
                System.out.format("Retrieved access key %s",Metadata.getAccessKeyId());
            }

            request.setMarker(response.getMarker());

            if (!response.getIsTruncated()) {
                done = true;
            }
        }
    }
项目:aws-doc-sdk-examples    文件:UpdateAccessKey.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a username,access key id and status\n" +
            "Ex: UpdateAccessKey <username> <access-key-id> <Activate|Inactive>\n";

        if (args.length != 3) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String username = args[0];
        String access_id = args[1];
        String status = args[2];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        UpdateAccessKeyRequest request = new UpdateAccessKeyRequest()
            .withAccessKeyId(access_id)
            .withUserName(username)
            .withStatus(status);

        UpdateAccessKeyResult response = iam.updateAccessKey(request);

        System.out.printf(
                "Successfully updated status of access key %s to" +
                "status %s for user %s",access_id,status,username);
    }
项目:aws-doc-sdk-examples    文件:UpdateServerCertificate.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply the current certificate name and\n" +
            "a new name. Ex:\n\n" +
            "UpdateServerCertificate <current-name> <new-name>\n";

        if (args.length != 2) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String cur_name = args[0];
        String new_name = args[1];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        UpdateServerCertificateRequest request =
            new UpdateServerCertificateRequest()
                .withServerCertificateName(cur_name)
                .withNewServerCertificateName(new_name);

        UpdateServerCertificateResult response =
            iam.updateServerCertificate(request);

        System.out.printf("Successfully updated server certificate to name %s",new_name);
    }
项目:aws-doc-sdk-examples    文件:ListServerCertificates.java   
public static void main(String[] args) {

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        boolean done = false;
        ListServerCertificatesRequest request =
                new ListServerCertificatesRequest();

        while(!done) {

            ListServerCertificatesResult response =
                iam.listServerCertificates(request);

            for(ServerCertificateMetadata Metadata :
                    response.getServerCertificateMetadataList()) {
                System.out.printf("Retrieved server certificate %s",Metadata.getServerCertificateName());
            }

            request.setMarker(response.getMarker());

            if(!response.getIsTruncated()) {
                done = true;
            }
        }
    }
项目:aws-doc-sdk-examples    文件:UpdateUser.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply the current username and a new\n" +
            "username. Ex:\n\n" +
            "UpdateUser <current-name> <new-name>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String cur_name = args[0];
        String new_name = args[1];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        UpdateUserRequest request = new UpdateUserRequest()
            .withUserName(cur_name)
            .withNewUserName(new_name);

        UpdateUserResult response = iam.updateUser(request);

        System.out.printf("Successfully updated user to username %s",new_name);
    }
项目:aws-doc-sdk-examples    文件:ListAccountAliases.java   
public static void main(String[] args) {

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        ListAccountAliasesResult response = iam.listAccountAliases();

        for (String alias : response.getAccountAliases()) {
            System.out.printf("Retrieved account alias %s",alias);
        }
    }
项目:aws-doc-sdk-examples    文件:DeleteUser.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a username\n" +
            "Ex: DeleteUser <username>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String username = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        DeleteUserRequest request = new DeleteUserRequest()
            .withUserName(username);

        try {
            iam.deleteUser(request);
        } catch (DeleteConflictException e) {
            System.out.println("Unable to delete user. Verify user is not" +
                    " associated with any resources");
            throw e;
        }

        System.out.println("Successfully deleted IAM user " + username);
    }
项目:cfnassist    文件:FacadeFactory.java   
private void createAmazonapiclients() {
       cfnClient = AmazonCloudFormationClientBuilder.defaultClient();
       ec2Client = AmazonEC2ClientBuilder.defaultClient();
       snsClient = AmazonSNSClientBuilder.defaultClient();
       sqsClient = AmazonSQSClientBuilder.defaultClient();
       elbClient = AmazonElasticLoadBalancingClientBuilder.defaultClient();
       s3Client = AmazonS3ClientBuilder.defaultClient();
       rdsClient = AmazonRDSClientBuilder.defaultClient();
       iamClient = AmazonIdentityManagementClientBuilder.defaultClient();
}
项目:strongBox    文件:IAMHelper.java   
IAMHelper(AWSCredentialsProvider awsCredentials,Region testRegion) {
    this.client = AmazonIdentityManagementClientBuilder.standard()
            .withCredentials(awsCredentials)
            .withRegion(testRegion.getName())
            .build();
}
项目:aws-doc-sdk-examples    文件:AttachRolePolicy.java   
public static void main(String[] args) {
    final String USAGE =
        "To run this example,supply a role name\n" +
        "Ex: AttachRolePolicy <role-name>\n";

    if (args.length != 1) {
        System.out.println(USAGE);
        System.exit(1);
    }

    String role_name = args[0];

    final AmazonIdentityManagement iam =
        AmazonIdentityManagementClientBuilder.defaultClient();

    ListAttachedRolePoliciesRequest request =
        new ListAttachedRolePoliciesRequest()
            .withRoleName(role_name);

    List<AttachedPolicy> matching_policies = new ArrayList<>();

    boolean done = false;

    while(!done) {
        ListAttachedRolePoliciesResult response =
            iam.listAttachedRolePolicies(request);

        matching_policies.addAll(
                response.getAttachedPolicies()
                        .stream()
                        .filter(p -> p.getPolicyName().equals(role_name))
                        .collect(Collectors.toList()));

        if(!response.getIsTruncated()) {
            done = true;
        }
        request.setMarker(response.getMarker());
    }

    if (matching_policies.size() > 0) {
        System.out.println(role_name +
                " policy is already attached to this role.");
        return;
    }

    AttachRolePolicyRequest attach_request =
        new AttachRolePolicyRequest()
            .withRoleName(role_name)
            .withPolicyArn(POLICY_ARN);

    iam.attachRolePolicy(attach_request);

    System.out.println("Successfully attached policy " + POLICY_ARN +
            " to role " + role_name);
}
项目:cmn-project    文件:IAM.java   
public IAM(AWSCredentialsProvider credentials,Regions region) {
    iam = AmazonIdentityManagementClientBuilder.standard().withRegion(region).withCredentials(credentials).build();
    this.region = Region.getRegion(region);
}
项目:cfnassist    文件:EnvironmentSetupForTests.java   
public static AmazonIdentityManagement createIamClient(DefaultAWSCredentialsProviderChain credentialsProvider) {
    return AmazonIdentityManagementClientBuilder.defaultClient();
}

com.amazonaws.services.identitymanagement.AmazonIdentityManagementClient的实例源码

com.amazonaws.services.identitymanagement.AmazonIdentityManagementClient的实例源码

项目:director-aws-plugin    文件:EC2InstanceTemplateConfigurationValidator.java   
/**
 * Validates the configured IAM profile.
 *
 * @param configuration       the configuration to be validated
 * @param accumulator         the exception condition accumulator
 * @param localizationContext the localization context
 */
@VisibleForTesting
void checkIamProfileName(Configured configuration,PluginExceptionConditionAccumulator accumulator,LocalizationContext localizationContext) {

  String iamProfileName =
      configuration.getConfigurationValue(IAM_PROFILE_NAME,localizationContext);

  if (iamProfileName != null) {
    AmazonIdentityManagementClient iamClient = provider.getIdentityManagementClient();

    try {
      iamClient.getInstanceProfile(new GetInstanceProfileRequest()
          .withInstanceProfileName(iamProfileName));

    } catch (NoSuchEntityException e) {
      addError(accumulator,IAM_PROFILE_NAME,localizationContext,null,INVALID_IAM_PROFILE_NAME_MSG,iamProfileName);
    }
  }
}
项目:fullstop    文件:IdentityManagementDataSource.java   
GetCredentialReportResult getCredentialReportCSV(final String accountId) {
    final AmazonIdentityManagementClient client = getIAMClient(accountId);

    GenerateCredentialReportResult generationReport;
    int i = 0;
    do {
        Assert.state(i < MAX_RETRIES,"Maximum retries to generate credentials report exceeded");
        log.debug("Poll credentials report for account {}",accountId);
        try {
            MILLISECONDS.sleep(RETRY_TIMEOUT_MILLIS * i);
        } catch (final InterruptedException e) {
            throw new RuntimeException("Could not pull credentials report",e);
        }
        generationReport = client.generateCredentialReport();
        i++;

    } while (!COMPLETE.toString().equals(generationReport.getState()));

    return client.getCredentialReport();
}
项目:fullstop    文件:CrossAccountPolicyForIAMJobTest.java   
@Before
public void setUp() throws Exception {
    this.violationSinkMock = mock(ViolationSink.class);
    this.clientProviderMock = mock(ClientProvider.class);
    this.accountIdsupplierMock = mock(AccountIdsupplier.class);
    this.jobsPropertiesMock = mock(JobsProperties.class);
    this.mockAmazonIdentityManagementClient = mock(AmazonIdentityManagementClient.class);
    this.mockAwsApplications = mock(AwsApplications.class);

    mockListRolesResult = new ListRolesResult();
    mockListRolesResult.setRoles(asList(
            createRole("aws-service-role",AWS_SERVICE_POLICY_DOCUMENT),createRole("cross-account-role",CROSS_ACCOUNT_POLICY_DOCUMENT),createRole("same-account-role",SAME_ACCOUNT_POLICY_DOCUMENT),createRole("deleted-role-reference-role",DELETED_ROLE_POLICY_DOCUMENT),createRole("management-account-role",MANAGEMENT_POLICY_DOCUMENT)));

    when(clientProviderMock.getClient(any(),any(String.class),any(Region.class))).thenReturn(mockAmazonIdentityManagementClient);
}
项目:aws-ant-tasks    文件:SetUpOpsWorksTestsTask.java   
/**
 * Sets the "instanceProfile" and "serviceRole" properties according to the
 * set parameters.
 */
public void execute() {
    checkParams();
    AmazonIdentityManagementClient iamClient = getorCreateClient(AmazonIdentityManagementClient.class);
    getProject()
            .setProperty(
                    "instanceProfileArn",iamClient
                            .getInstanceProfile(
                                    new GetInstanceProfileRequest()
                                            .withInstanceProfileName(instanceProfile))
                            .getInstanceProfile().getArn());
    getProject()
            .setProperty(
                    "serviceRoleArn",iamClient
                            .getRole(
                                    new GetRoleRequest()
                                            .withRoleName(serviceRole))
                            .getRole().getArn());

}
项目:aws-sdk-first-steps    文件:Launcher.java   
public static void main(String... args) throws IOException {
    AWSCredentialsProvider credentials = CredentialsUtils.getAwsCredentials();

    AmazonS3 storage = new AmazonS3Client(credentials);
    storage.setRegion(Region.getRegion(Regions.EU_WEST_1));

    AmazonSQS queue = new AmazonSQSClient(credentials);
    queue.setRegion(Region.getRegion(Regions.EU_WEST_1));

    AmazonEC2 machines = new AmazonEC2Client(credentials);
    machines.setRegion(Region.getRegion(Regions.EU_WEST_1));

    AmazonIdentityManagement identityManagement = new AmazonIdentityManagementClient(credentials);
    identityManagement.setRegion(Region.getRegion(Regions.EU_WEST_1));

    if ("launch".equals(args[0])) {
        setup(storage,queue,machines,identityManagement);

        manageAnswers(queue);
    } else if ("run".equals(args[0])) {
        run(storage,queue);
    } else {
        System.out.println("Huh hoh! Don't kNow what you intended to do...");
    }
}
项目:reinvent2013-mobile-photo-share    文件:Configuration.java   
private static String getAWSAccountID() {
    try {
        String accessKey = AWS_ACCESS_KEY_ID;
        String secretKey = AWS_SECRET_KEY;

        if (Utilities.isEmpty(accessKey) || Utilities.isEmpty(secretKey)) {
            return null;
        }

        AWSCredentials creds = new BasicAWSCredentials(accessKey,secretKey);
        AmazonIdentityManagementClient iam = new AmazonIdentityManagementClient(creds);
        return iam.getUser().getUser().getArn().split(":")[4];
    } catch (AmazonClientException e) {
        throw new RuntimeException("Failed to get AWS account id",e);
    }
}
项目:strongBox    文件:IAMPolicyManagerTest.java   
@BeforeMethod
public void setUp() {
    mockCredentials = mock(AWSCredentialsProvider.class);
    mockClient = mock(AmazonIdentityManagementClient.class);
    ClientConfiguration mockConfig = mock(ClientConfiguration.class);
    IAMPolicyManager policyManager = new IAMPolicyManager(mockClient,mockCredentials,mockConfig);

    // The mockito spy acts like original object but mocks out the getAccount() method. As the getAccount() calls
    // directly rather than via a client that we can pass in we need to mock this out using a spy.
    partiallyMockedPolicyManager = spy(policyManager);
    doReturn(ACCOUNT).when(partiallyMockedPolicyManager).getAccount();

    // Set up KMSEncryptor for testing the policy creation methods. This gets a bit complicated but we need to
    // mock all the AWS dependencies from the KMSManager before using it to create the KMSEncryptor. The getAliasArn
    // needs to be mocked out with a spy to stop the call to getAccount.
    mockKMSClient = mock(AWSKMSClient.class);
    KMSManager kmsManager = new KMSManager(mockKMSClient,mockConfig,group);
    KMSManager partiallyMockedKMSManager = spy(kmsManager);
    doReturn(KMS_ALIAS_ARN).when(partiallyMockedKMSManager).getAliasArn();
    kmsEncryptor = new KMSEncryptor(partiallyMockedKMSManager,group,mock(AwsCrypto.class),EncryptionStrength.AES_256);

    // Set up store for testing the policy creation methods. Mock out the getArn method with a spy to stop the
    // call to getAccount().
    mockDynamoDBClient = mock(AmazonDynamoDBClient.class);
    DynamoDB store = new DynamoDB(mockDynamoDBClient,new reentrantreadwritelock());
    partiallyMockedStore = spy(store);
    doReturn(DYNAMODB_ARN).when(partiallyMockedStore).getArn();
}
项目:photon-model    文件:AWSEndpointAdapterService.java   
/**
 * Method gets the aws accountId from the specified credentials.
 *
 * @param privateKeyId
 * @param privateKey
 * @return account ID
 */
private String getAccountId(String privateKeyId,String privateKey) {
    AWSCredentials awsCredentials = new BasicAWSCredentials(privateKeyId,privateKey);

    AWsstaticCredentialsProvider awsstaticCredentialsProvider = new AWsstaticCredentialsProvider(
            awsCredentials);

    AmazonIdentityManagementClientBuilder amazonIdentityManagementClientBuilder = AmazonIdentityManagementClientBuilder
            .standard()
            .withCredentials(awsstaticCredentialsProvider)
            .withRegion(Regions.DEFAULT_REGION);

    AmazonIdentityManagementClient iamClient = (AmazonIdentityManagementClient) amazonIdentityManagementClientBuilder
            .build();

    String userId = null;
    try {
        if ((iamClient.getUser() != null) && (iamClient.getUser().getUser() != null)
                && (iamClient.getUser().getUser().getArn() != null)) {

            String arn = iamClient.getUser().getUser().getArn();
            /*
             * arn:aws:service:region:account:resource -> so limiting the split to 6 words and
             * extracting the accountId which is 5th one in list. If the user is not authorized
             * to perform iam:GetUser on that resource,still error mesage will have accountId
             */
            userId = arn.split(":",6)[4];
        }
    } catch (AmazonServiceException ex) {
        if (ex.getErrorCode().compareto("AccessDenied") == 0) {
            String msg = ex.getMessage();
            userId = msg.split(":",7)[5];
        } else {
            logSevere("Exception getting the accountId %s",ex);

        }
    }
    return userId;
}
项目:cerberus-lifecycle-cli    文件:CerberusModule.java   
/**
 * Binds all the Amazon services used.
 */
@Override
protected void configure() {
    final Region region = Region.getRegion(Regions.fromName(regionName));
    bind(AmazonEC2.class).toInstance(createAmazonClientInstance(AmazonEC2Client.class,region));
    bind(AmazonCloudFormation.class).toInstance(createAmazonClientInstance(AmazonCloudFormationClient.class,region));
    bind(AmazonIdentityManagement.class).toInstance(createAmazonClientInstance(AmazonIdentityManagementClient.class,region));
    bind(AWSKMS.class).toInstance(createAmazonClientInstance(AWSKMSClient.class,region));
    bind(AmazonS3.class).toInstance(createAmazonClientInstance(AmazonS3Client.class,region));
    bind(AmazonAutoScaling.class).toInstance(createAmazonClientInstance(AmazonAutoScalingClient.class,region));
    bind(AWSSecurityTokenService.class).toInstance(createAmazonClientInstance(AWSSecurityTokenServiceClient.class,region));
    bind(AWSLambda.class).toInstance(createAmazonClientInstance(AWSLambdaClient.class,region));
    bind(AmazonSNS.class).toInstance(createAmazonClientInstance(AmazonSNSClient.class,region));
}
项目:fullstop    文件:PolicyProviderImpl.java   
@Override
public RolePolicies getRolePolicies(String roleName,Region region,String accountId) {
    final AmazonIdentityManagementClient iamClient = clientProvider
            .getClient(AmazonIdentityManagementClient.class,accountId,region);
    final Set<String> attachedPolicyNames = fetchAttachedPolicyNames(roleName,iamClient);
    final Set<String> inlinePolicyNames = fetchInlinePolicyNames(roleName,iamClient);
    // assuming that there is an inline policy with the same name as the role itself
    final String mainPolicy = inlinePolicyNames.contains(roleName) ? fetchMainPolicy(roleName,iamClient) : EMPTY_JSON;

    return new RolePolicies(attachedPolicyNames,inlinePolicyNames,mainPolicy);
}
项目:fullstop    文件:PolicyProviderImpl.java   
private String fetchMainPolicy(String roleName,AmazonIdentityManagementClient iamClient) {
    return Optional.of(new GetRolePolicyRequest().withRoleName(roleName).withPolicyName(roleName))
            .map(iamClient::getRolePolicy)
            .map(GetRolePolicyResult::getPolicyDocument)
            .map(PolicyProviderImpl::urlDecode)
            .orElse(EMPTY_JSON);
}
项目:fullstop    文件:PolicyProviderImpl.java   
private Set<String> fetchInlinePolicyNames(String roleName,AmazonIdentityManagementClient iamClient) {
    return Optional.of(new ListRolePoliciesRequest().withRoleName(roleName))
            .map(iamClient::listRolePolicies)
            .map(ListRolePoliciesResult::getPolicyNames)
            .map(nameList -> nameList.stream().collect(toSet()))
            .orElseGet(Collections::emptySet);
}
项目:fullstop    文件:PolicyProviderImpl.java   
private Set<String> fetchAttachedPolicyNames(String roleName,AmazonIdentityManagementClient iamClient) {
    return Optional.of(new ListAttachedRolePoliciesRequest().withRoleName(roleName))
            .map(iamClient::listAttachedRolePolicies)
            .map(ListAttachedRolePoliciesResult::getAttachedPolicies)
            .map(attachedPolicies -> attachedPolicies.stream().map(AttachedPolicy::getPolicyName).collect(toSet()))
            .orElseGet(Collections::emptySet);
}
项目:aws-utilization-monitor    文件:AwsAccount.java   
/**
 * Read AWS account ID
 */
public void retrieveAccountIdFromAwsAPI() {
    String accountId = "";

    try {
        AmazonIdentityManagementClient iamClient = new AmazonIdentityManagementClient(getCredentials());
        LOG.info("Current AWS user: " + iamClient.getUser().getUser().getUserId());
        accountId = iamClient.getUser().getUser().getArn();
    } catch (AmazonServiceException e) {
        if (e.getErrorCode().compareto("AccessDenied") == 0) {
            String arn = null;
            String msg = e.getMessage();
            // User:
            // arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob
            // is not authorized to perform: iam:GetUser on
            // resource:
            // arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob
            // arn:aws:sts::123456789012:assumed-role/Shibboleth-PowerUser/username
            int arnIdx = msg.indexOf("arn:aws");
            if (arnIdx != -1) {
                int arnSpace = msg.indexOf(" ",arnIdx);
                arn = msg.substring(arnIdx,arnSpace);

                // Remove "arn:aws:sts::"
                arn = arn.substring(13,13 + 12);
            }
            accountId = arn;
        }

        if ((accountId == null) || (accountId.length() == 0)) {
            LOG.warn("Cannot lookup account id: " + e.getMessage());
        }
    } catch (Exception ex) {
        LOG.error("Cannot lookup account id: " + ex.getMessage());
    }

    setAccountId(accountId);
}
项目:aws-codedeploy-plugin    文件:AWSClients.java   
/**
 * Via the default provider chain (i.e.,global keys for this Jenkins instance),return the account ID for the
 * currently authenticated user.
 * @param proxyHost hostname of the proxy to use (if any)
 * @param proxyPort port of the proxy to use (if any)
 * @return 12-digit account id
 */
public static String getAccountId(String proxyHost,int proxyPort) {

    String arn = "";
    try {
        ClientConfiguration clientCfg = new ClientConfiguration();
        if (proxyHost != null && proxyPort > 0 ) {
            clientCfg.setProxyHost(proxyHost);
            clientCfg.setProxyPort(proxyPort);
        }
        AmazonIdentityManagementClient iam = new AmazonIdentityManagementClient(clientCfg);
        GetUserResult user = iam.getUser();
        arn = user.getUser().getArn();
    } catch (AmazonServiceException e) {
        if (e.getErrorCode().compareto("AccessDenied") == 0) {
            String msg = e.getMessage();
            int arnIdx = msg.indexOf("arn:aws");
            if (arnIdx != -1) {
                int arnSpace = msg.indexOf(" ",arnSpace);
            }
        }
    }

    String accountId = arn.split(":")[ARN_ACCOUNT_ID_INDEX];
    return accountId;
}
项目:aws-ant-tasks    文件:SetUpBeanstalkTestsTask.java   
public void execute() {
    AmazonIdentityManagementClient iamClient = getorCreateClient(AmazonIdentityManagementClient.class);
    iamClient.createInstanceProfile(new CreateInstanceProfileRequest()
            .withInstanceProfileName(instanceProfile));
    iamClient
            .addRoletoInstanceProfile(new AddRoletoInstanceProfileRequest()
                    .withRoleName(INSTANCEPROFILE_ROLE)
                    .withInstanceProfileName(instanceProfile));
}
项目:aws-ant-tasks    文件:CleanUpBeanstalkTestsTask.java   
public void execute() {
    AmazonIdentityManagementClient iamClient = getorCreateClient(AmazonIdentityManagementClient.class);
    iamClient
            .removeRoleFromInstanceProfile(new RemoveRoleFromInstanceProfileRequest()
                    .withRoleName(INSTANCEPROFILE_ROLE)
                    .withInstanceProfileName(instanceProfile));
    iamClient.deleteInstanceProfile(new DeleteInstanceProfileRequest()
            .withInstanceProfileName(instanceProfile));
    AmazonS3Client client = getorCreateClient(AmazonS3Client.class);

    AWSTestUtils.emptyAndDeleteBucket(client,bucketName);
}
项目:billow    文件:AWSDatabase.java   
AWSDatabase(final Map<String,AmazonEC2Client> ec2Clients,final Map<String,AmazonRDSClient> rdsClients,AmazonDynamoDBClient> dynamoClients,AmazonSQSClient> sqsClients,AmazonElastiCacheClient> elasticacheClients,final AmazonIdentityManagementClient iamClient) {
    this(ec2Clients,rdsClients,dynamoClients,sqsClients,elasticacheClients,iamClient,null);
}
项目:clouck    文件:IamWrapperImpl.java   
private AmazonIdentityManagement findClient(String accessKeyId,String secretAccessKey) {
        // Todo: need to config client config parameter. ignore it for Now.
        AWSCredentials credential = new BasicAWSCredentials(accessKeyId,secretAccessKey);
        AmazonIdentityManagement iam = new AmazonIdentityManagementClient(credential);
//        iam.setEndpoint(Region.toIamEndpoint());
        return iam;
    }
项目:datamung    文件:Ec2ActivitiesImpl.java   
/**
 * @inheritDoc
 */
@Override
public void createAgentInstanceProfile( String profileName,String controlRoleArn,Identity identity )
{
    AmazonIdentityManagement iam =
        ActivityUtils.createClient( AmazonIdentityManagementClient.class,identity );

    // Create role if necessary
    String roleName = profileName + "-role";
    Map<String,String> policyVariables = new HashMap<String,String>();
    policyVariables.put( "CONTROLLER_ROLE_ARN",controlRoleArn );
    Role role =
        ActivityUtils.createRole( roleName,iam,"datamung/agent-policy.json",policyVariables,"datamung/agent-trust.json",null );

    // Create instance profile and associate role if necessary
    boolean roleAssociationrequired = true;
    try
    {
        iam.createInstanceProfile( new CreateInstanceProfileRequest().withInstanceProfileName( profileName ).withPath( role.getPath() ) );
    }
    catch ( EntityAlreadyExistsException e )
    {
        LOG.info( "Instance profile " + profileName + " already exists!" );
        roleAssociationrequired =
            iam.getInstanceProfile( new GetInstanceProfileRequest().withInstanceProfileName( profileName ) ).getInstanceProfile().getRoles().isEmpty();
    }
    if ( roleAssociationrequired )
    {
        LOG.info( "Adding role " + roleName + " to instance profile "
            + profileName );
        iam.addRoletoInstanceProfile( new AddRoletoInstanceProfileRequest().withInstanceProfileName( profileName ).withRoleName( roleName ) );
    }
}
项目:datamung    文件:Ec2ActivitiesImpl.java   
/**
 * @inheritDoc
 */
@Override
public void deleteInstanceProfile( String profileName,identity );

    String roleName = profileName + "-role";
    try
    {
        GetInstanceProfileResult profileResult =
            iam.getInstanceProfile( new GetInstanceProfileRequest().withInstanceProfileName( profileName ) );

        if ( !profileResult.getInstanceProfile().getRoles().isEmpty() )
        {
            iam.removeRoleFromInstanceProfile( new RemoveRoleFromInstanceProfileRequest().withInstanceProfileName( profileName ).withRoleName( roleName ) );
        }

        iam.deleteInstanceProfile( new DeleteInstanceProfileRequest().withInstanceProfileName( profileName ) );
    }
    catch ( NoSuchEntityException e )
    {
        LOG.info( "Instance profile is already gone: " + profileName );
    }
    ActivityUtils.deleteRole( roleName,iam );
}
项目:datamung    文件:ControlActivitiesImpl.java   
/**
 * @inheritDoc
 */
@Override
public String createAgentControllerRole( String roleName,String workflowTaskList,Identity identity )
{
    Map<String,String>();
    policyVariables.put( "CONTROLLER_ACCOUNT_ID",accountId );
    policyVariables.put( "SWF_DOMAIN",contextProvider.getActivityExecutionContext().getDomain() );
    policyVariables.put( "TASK_LIST",workflowTaskList );

    AmazonIdentityManagement clientIam =
        ActivityUtils.createClient( AmazonIdentityManagementClient.class,identity );

    Map<String,String> trustvariables = new HashMap<String,String>();
    trustvariables.put( "CLIENT_EXTERNAL_ID",AgentConfig.ROLE_EXTERNAL_ID );
    trustvariables.put( "CLIENT_ACCOUNT_ID",ActivityUtils.getAccountId( clientIam ) );

    Role role =
        ActivityUtils.createRole( roleName,serverIam,"datamung/agent-controller-policy.json","datamung/agent-controller-trust.json",trustvariables );
    return role.getArn();
}
项目:strongBox    文件:PrincipalAutoSuggestionTest.java   
@BeforeMethod
public void setUp() {
    mockClient = mock(AmazonIdentityManagementClient.class);
    PrincipalAutoSuggestion principalAutoSuggestion = new PrincipalAutoSuggestion(mockClient);
    partiallyMockedPrincipalAutoSuggestion= spy(principalAutoSuggestion);
}
项目:AWSConfig    文件:IamUtilsImpl.java   
/**
 * Default constructor.
 */
public IamUtilsImpl() {
    this.iamClient = new AmazonIdentityManagementClient();
}
项目:director-aws-plugin    文件:EC2Provider.java   
public AmazonIdentityManagementClient getIdentityManagementClient() {
  return identityManagementClient;
}
项目:fullstop    文件:IdentityManagementDataSource.java   
private AmazonIdentityManagementClient getIAMClient(final String accountId) {
    return clientProvider.getClient(AmazonIdentityManagementClient.class,Region.getRegion(EU_WEST_1));
}
项目:gravity    文件:AwsAutomationAction.java   
public AmazonIdentityManagementClient getIdentityClient() {
    return identityClient;
}
项目:gravity    文件:AwsAutomationAction.java   
public void setIdentityClient(AmazonIdentityManagementClient identityClient) {
    this.identityClient = identityClient;
}
项目:DeployMan    文件:aim.java   
@Override
public AmazonIdentityManagement getClient()
{
  AWSCredentials credentials = new Aws().getAwsCredentials();
  return new AmazonIdentityManagementClient( credentials );
}
项目:s3-cf-service-broker    文件:brokerConfiguration.java   
@Bean
public AmazonIdentityManagement amazonIdentityManagement() {
    return new AmazonIdentityManagementClient(awsCredentials(),awsClientConfiguration.toClientConfiguration());
}
项目:aws-ant-tasks    文件:OpsWorksDeploymentTests.java   
@BeforeClass
public static void setUp() {
    s3Client = new AmazonS3Client();
    client = new AWSOpsWorksClient();
    iamClient = new AmazonIdentityManagementClient();
}
项目:cloudbreak    文件:AwsClient.java   
public AmazonIdentityManagement createAmazonIdentityManagement(AwsCredentialView awsCredential) {
    return isRoleAssumerequired(awsCredential)
            ? new AmazonIdentityManagementClient(credentialClient.retrieveCachedSessionCredentials(awsCredential))
            : new AmazonIdentityManagementClient(createAwsCredentials(awsCredential));
}
项目:billow    文件:AWSDatabaseHolder.java   
public AWSDatabaseHolder(Config config) {
    maxAgeInMs = config.getDuration("maxAge",TimeUnit.MILLISECONDS);

    final DefaultAWSCredentialsProviderChain awsCredentialsProviderChain = new DefaultAWSCredentialsProviderChain();

    final ClientConfiguration clientConfig = new ClientConfiguration();
    clientConfig.setRetryPolicy(new RetryPolicy(null,config.getInt("maxErrorRetry"),true));

    final AmazonEC2Client bootstrapEC2Client = new AmazonEC2Client(awsCredentialsProviderChain);
    ec2Clients = Maps.newHashMap();
    rdsClients = Maps.newHashMap();
    sqsClients = Maps.newHashMap();
    dynamoDBClients = Maps.newHashMap();
    elasticacheClients = Maps.newHashMap();

    final List<Region> ec2Regions = bootstrapEC2Client.describeRegions().getRegions();
    for (Region region : ec2Regions) {
        final String regionName = region.getRegionName();
        final String endpoint = region.getEndpoint();
        log.debug("Adding ec2 region {}",region);

        final AmazonEC2Client ec2Client = new AmazonEC2Client(awsCredentialsProviderChain,clientConfig);
        ec2Client.setEndpoint(endpoint);
        ec2Clients.put(regionName,ec2Client);

        final AmazonRDSClient rdsClient = new AmazonRDSClient(awsCredentialsProviderChain,clientConfig);
        rdsClient.setEndpoint(endpoint.replaceFirst("ec2\\.","rds."));
        rdsClients.put(regionName,rdsClient);

        final AmazonDynamoDBClient dynamoDBClient =
            new AmazonDynamoDBClient(awsCredentialsProviderChain,clientConfig);
        dynamoDBClient.setEndpoint(endpoint.replaceFirst("ec2\\.","dynamodb."));
        dynamoDBClients.put(regionName,dynamoDBClient);

        final AmazonSQSClient sqsClient = new AmazonSQSClient(awsCredentialsProviderChain,clientConfig);
        sqsClient.setEndpoint(endpoint.replaceFirst("ec2\\.","sqs."));
        sqsClients.put(regionName,sqsClient);

        final AmazonElastiCacheClient elastiCacheClient = new AmazonElastiCacheClient
            (awsCredentialsProviderChain,clientConfig);
        elastiCacheClient.setEndpoint(endpoint.replaceFirst("ec2\\.","elasticache."));
        elasticacheClients.put(regionName,elastiCacheClient);
    }

    this.iamClient = new AmazonIdentityManagementClient(awsCredentialsProviderChain,clientConfig);

    if (config.hasPath("accountNumber")) {
        this.awsAccountNumber = config.getString("accountNumber");
    } else {
        this.awsAccountNumber = null;
    }

    rebuild();
}
项目:fullstop    文件:PolicyProviderTest.java   
@Before
public void setUp() throws Exception {
    clientMock = mock(AmazonIdentityManagementClient.class);

    final ClientProvider clientProviderMock = mock(ClientProvider.class);
    when(clientProviderMock.getClient(any(),any(),any())).thenReturn(clientMock);

    policyProvider = new PolicyProviderImpl(clientProviderMock);

}
项目:AWSConfig    文件:IamUtilsImpl.java   
/**
 * Parameterized constructor. Pass the AWS Region as parameter.
 * @param region 
 */
public IamUtilsImpl(Regions region) {
    this.iamClient = new AmazonIdentityManagementClient().withRegion(region);        
}
项目:aws-sdk-java-resources    文件:IdentityManagementImpl.java   
/**
 * Construct a service implementation that talks to the specified AWS
 * region. The low-level client will be created via the default no-arg
 * constructor,which means it will have all the default client
 * configurations and it will use the default provider chain to retrieve AWS
 * credentials. If you need more flexible control over the low-level client,* use {@link #IdentityManagementImpl(AmazonIdentityManagement)} instead.
 *
 * @param region The AWS region where the service API calls will be sent to.
 */
public IdentityManagementImpl(Regions region) {
    this(new AmazonIdentityManagementClient());
    this.client().setRegion(Region.getRegion(region));
}

com.amazonaws.services.identitymanagement.AmazonIdentityManagement的实例源码

com.amazonaws.services.identitymanagement.AmazonIdentityManagement的实例源码

项目:cyberduck    文件:AmazonIdentityConfiguration.java   
private AmazonIdentityManagement client() {
    return AmazonIdentityManagementClientBuilder.standard()
            .withCredentials(new AWsstaticCredentialsProvider(new AWSCredentials() {
                @Override
                public String getAWSAccessKeyId() {
                    return bookmark.getCredentials().getUsername();
                }

                @Override
                public String getAWSSecretKey() {
                    return bookmark.getCredentials().getpassword();
                }
            }))
            .withClientConfiguration(configuration)
            .withRegion(Regions.DEFAULT_REGION).build();
}
项目:Sqawsh    文件:CognitoCustomresourceLambda.java   
void addRolesToIdentityPool(String unauthenticatedRoleName,String unauthenticatedRole,String authenticatedRoleName,String authenticatedRole,String identityPoolId,AmazonCognitoIdentity client,LambdaLogger logger) {
  // First update the roles to use the actual pool id in their conditions
  logger
      .log("Updating authenticated and unauthenticated roles to use the actual identity pool id: "
          + identityPoolId);
  AmazonIdentityManagement iamClient = AmazonIdentityManagementClientBuilder.standard().build();
  UpdateAssumeRolePolicyRequest updateAssumeRolePolicyRequest = new UpdateAssumeRolePolicyRequest();
  updateAssumeRolePolicyRequest.setRoleName(unauthenticatedRoleName);
  updateAssumeRolePolicyRequest.setPolicyDocument(getAssumeRolePolicyDocument(false,identityPoolId,logger));
  iamClient.updateAssumeRolePolicy(updateAssumeRolePolicyRequest);
  updateAssumeRolePolicyRequest.setRoleName(authenticatedRoleName);
  updateAssumeRolePolicyRequest.setPolicyDocument(getAssumeRolePolicyDocument(true,logger));
  iamClient.updateAssumeRolePolicy(updateAssumeRolePolicyRequest);

  // And add the updated roles to the pool
  logger.log("Adding updated authenticated and unauthenticated roles to the identity pool");
  SetIdentityPoolRolesRequest setIdentityPoolRolesRequest = new SetIdentityPoolRolesRequest();
  setIdentityPoolRolesRequest.addRolesEntry("authenticated",authenticatedRole);
  setIdentityPoolRolesRequest.addRolesEntry("unauthenticated",unauthenticatedRole);
  setIdentityPoolRolesRequest.setIdentityPoolId(identityPoolId);
  client.setIdentityPoolRoles(setIdentityPoolRolesRequest);
}
项目:aws-doc-sdk-examples    文件:createuser.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a username\n" +
            "Ex: createuser <username>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String username = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        createuserRequest request = new createuserRequest()
            .withUserName(username);

        createuserResult response = iam.createuser(request);

        System.out.println("Successfully created user: " +
                response.getUser().getUserName());
    }
项目:aws-doc-sdk-examples    文件:GetServerCertificate.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a certificate name\n" +
            "Ex: GetServerCertificate <certificate-name>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String cert_name = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        GetServerCertificateRequest request = new GetServerCertificateRequest()
                    .withServerCertificateName(cert_name);

        GetServerCertificateResult response = iam.getServerCertificate(request);

        System.out.format("Successfully retrieved certificate with body %s",response.getServerCertificate().getCertificateBody());
    }
项目:aws-doc-sdk-examples    文件:GetPolicy.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a policy arn\n" +
            "Ex: GetPolicy <policy-arn>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String policy_arn = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        GetPolicyRequest request = new GetPolicyRequest()
            .withPolicyArn(policy_arn);

        GetPolicyResult response = iam.getPolicy(request);

        System.out.format("Successfully retrieved policy %s",response.getPolicy().getPolicyName());
    }
项目:aws-doc-sdk-examples    文件:DeleteServerCertificate.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a certificate name\n" +
            "Ex: DeleteServerCertificate <certificate-name>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String cert_name = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        DeleteServerCertificateRequest request =
            new DeleteServerCertificateRequest()
                .withServerCertificateName(cert_name);

        DeleteServerCertificateResult response =
            iam.deleteServerCertificate(request);

        System.out.println("Successfully deleted server certificate " +
                cert_name);
    }
项目:aws-doc-sdk-examples    文件:DetachRolePolicy.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a role name and policy arn\n" +
            "Ex: DetachRolePolicy <role-name> <policy-arn>>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String role_name = args[0];
        String policy_arn = args[1];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        DetachRolePolicyRequest request = new DetachRolePolicyRequest()
            .withRoleName(role_name)
            .withPolicyArn(policy_arn);

        DetachRolePolicyResult response = iam.detachRolePolicy(request);

        System.out.println("Successfully detached policy " + policy_arn +
                " from role " + role_name);
    }
项目:aws-doc-sdk-examples    文件:DeleteAccountAlias.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply an account alias\n" +
            "Ex: DeleteAccountAlias <account-alias>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String alias = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        DeleteAccountAliasRequest request = new DeleteAccountAliasRequest()
            .withAccountAlias(alias);

        DeleteAccountAliasResult response = iam.deleteAccountAlias(request);

        System.out.println("Successfully deleted account alias " + alias);
    }
项目:aws-doc-sdk-examples    文件:ListUsers.java   
public static void main(String[] args) {

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        boolean done = false;
        ListUsersRequest request = new ListUsersRequest();

        while(!done) {
            ListUsersResult response = iam.listUsers(request);

            for(User user : response.getUsers()) {
                System.out.format("Retrieved user %s",user.getUserName());
            }

            request.setMarker(response.getMarker());

            if(!response.getIsTruncated()) {
                done = true;
            }
        }
    }
项目:aws-doc-sdk-examples    文件:CreateAccessKey.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply an IAM user\n" +
            "Ex: CreateAccessKey <user>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String user = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        CreateAccessKeyRequest request = new CreateAccessKeyRequest()
            .withUserName(user);

        CreateAccessKeyResult response = iam.createAccessKey(request);

        System.out.println("Created access key: " + response.getAccessKey());
    }
项目:aws-doc-sdk-examples    文件:AccessKeyLastUsed.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply an access key id\n" +
            "Ex: AccessKeyLastUsed <access-key-id>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String access_id = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        GetAccessKeyLastUsedRequest request = new GetAccessKeyLastUsedRequest()
            .withAccessKeyId(access_id);

        GetAccessKeyLastUsedResult response = iam.getAccessKeyLastUsed(request);

        System.out.println("Access key was last used at: " +
                response.getAccessKeyLastUsed().getLastUsedDate());
    }
项目:aws-doc-sdk-examples    文件:CreatePolicy.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a policy name\n" +
            "Ex: CreatePolicy <policy-name>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String policy_name = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        CreatePolicyRequest request = new CreatePolicyRequest()
            .withPolicyName(policy_name)
            .withPolicyDocument(POLICY_DOCUMENT);

        CreatePolicyResult response = iam.createPolicy(request);

        System.out.println("Successfully created policy: " +
                response.getPolicy().getPolicyName());
    }
项目:aws-doc-sdk-examples    文件:DeleteAccessKey.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a username and access key id\n" +
            "Ex: DeleteAccessKey <username> <access-key-id>\n";

        if (args.length != 2) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String username = args[0];
        String access_key = args[1];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        DeleteAccessKeyRequest request = new DeleteAccessKeyRequest()
            .withAccessKeyId(access_key)
            .withUserName(username);

        DeleteAccessKeyResult response = iam.deleteAccessKey(request);

        System.out.println("Successfully deleted access key " + access_key +
                " from user " + username);
    }
项目:aws-doc-sdk-examples    文件:CreateAccountAlias.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply an alias\n" +
            "Ex: CreateAccountAlias <alias>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String alias = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        CreateAccountAliasRequest request = new CreateAccountAliasRequest()
            .withAccountAlias(alias);

        CreateAccountAliasResult response = iam.createAccountAlias(request);

        System.out.println("Successfully created account alias: " + alias);
    }
项目:aws-maven-plugin    文件:AwsPropertyMojo.java   
@Override
public void execute() throws MojoExecutionException,MojoFailureException {
    Proxy proxy = new Proxy(httpsProxyHost,httpsProxyPort,httpsProxyUsername,httpsProxyPassword);
    AwsKeyPair keyPair = Util.getAwsKeyPair(serverId,awsAccessKey,awsSecretAccessKey,settings,decrypter);
    final AWSCredentialsProvider credentials = new AWsstaticCredentialsProvider(
            new BasicAWSCredentials(keyPair.key,keyPair.secret));
    ClientConfiguration cc = Util.createConfiguration(proxy);

    AmazonIdentityManagement iam = AmazonIdentityManagementClientBuilder //
            .standard() //
            .withRegion(region) //
            .withCredentials(credentials) //
            .withClientConfiguration(cc) //
            .build();
    String accountId = iam.getUser().getUser().getUserId();
    project.getProperties().setProperty("aws.account.id",accountId);
    getLog().info("The following properties have been set for the project");
    getLog().info("aws.account.id=" + accountId);
}
项目:DeployMan    文件:aim.java   
public void createS3BucketProfile()
{
  AmazonIdentityManagement aim = getClient();

  String profile = getUserProperty( REPO_PROFILE );
  String role = getUserProperty( REPO_ROLE );

  if ( instanceProfileExists( profile ) )
  {
    console.write( "Profile '" + profile + "' already exists" ); //$NON-NLS-1$ //$NON-NLS-2$
    return;
  }

  CreateInstanceProfileResult result = aim.createInstanceProfile( new CreateInstanceProfileRequest().withInstanceProfileName( profile ) );

  // add roles to profil
  aim.addRoletoInstanceProfile( new AddRoletoInstanceProfileRequest().withInstanceProfileName( profile )
                                                                     .withRoleName( role ) );

  console.write( "Profile '" + profile + "' created at " + result.getInstanceProfile().getCreateDate() ); //$NON-NLS-1$ //$NON-NLS-2$
}
项目:cloudbreak    文件:AwsSetup.java   
private boolean checkIamOrS3Statement(String roleName,AmazonIdentityManagement client,String s) throws Exception {
    GetRolePolicyRequest getRolePolicyRequest = new GetRolePolicyRequest();
    getRolePolicyRequest.setRoleName(roleName);
    getRolePolicyRequest.setPolicyName(s);
    GetRolePolicyResult rolePolicy = client.getRolePolicy(getRolePolicyRequest);
    String decode = URLDecoder.decode(rolePolicy.getPolicyDocument(),"UTF-8");
    JsonNode object = JsonUtil.readTree(decode);
    JsonNode statement = object.get("Statement");
    for (int i = 0; i < statement.size(); i++) {
        JsonNode action = statement.get(i).get("Action");
        for (int j = 0; j < action.size(); j++) {
            String actionEntry = action.get(j).textValue().replaceAll(" ","").toLowerCase();
            if ("iam:createrole".equals(actionEntry) || "iam:*".equals(actionEntry)) {
                LOGGER.info("Role has able to operate on iam resources: {}.",action.get(j));
                return true;
            }
        }
    }
    return false;
}
项目:aws-sdk-first-steps    文件:Launcher.java   
public static void main(String... args) throws IOException {
    AWSCredentialsProvider credentials = CredentialsUtils.getAwsCredentials();

    AmazonS3 storage = new AmazonS3Client(credentials);
    storage.setRegion(Region.getRegion(Regions.EU_WEST_1));

    AmazonSQS queue = new AmazonSQSClient(credentials);
    queue.setRegion(Region.getRegion(Regions.EU_WEST_1));

    AmazonEC2 machines = new AmazonEC2Client(credentials);
    machines.setRegion(Region.getRegion(Regions.EU_WEST_1));

    AmazonIdentityManagement identityManagement = new AmazonIdentityManagementClient(credentials);
    identityManagement.setRegion(Region.getRegion(Regions.EU_WEST_1));

    if ("launch".equals(args[0])) {
        setup(storage,queue,machines,identityManagement);

        manageAnswers(queue);
    } else if ("run".equals(args[0])) {
        run(storage,queue);
    } else {
        System.out.println("Huh hoh! Don't kNow what you intended to do...");
    }
}
项目:strongBox    文件:PrincipalAutoSuggestion.java   
public static PrincipalAutoSuggestion fromCredentials(AWSCredentialsProvider awsCredentials,ClientConfiguration clientConfiguration) {

        AmazonIdentityManagement client = AmazonIdentityManagementClientBuilder.standard()
                .withCredentials(awsCredentials)
                .withClientConfiguration(transformAndVerifyOrThrow(clientConfiguration))
                .withRegion(RegionResolver.getRegion())
                .build();

        return new PrincipalAutoSuggestion(client);
    }
项目:strongBox    文件:IAMPolicyManager.java   
public static IAMPolicyManager fromCredentials(AWSCredentialsProvider awsCredentials,ClientConfiguration clientConfiguration) {
    AmazonIdentityManagement client = AmazonIdentityManagementClientBuilder.standard()
        .withCredentials(awsCredentials)
        .withClientConfiguration(transformAndVerifyOrThrow(clientConfiguration))
        .withRegion(RegionResolver.getRegion())
        .build();
    return new IAMPolicyManager(client,awsCredentials,clientConfiguration);
}
项目:strongBox    文件:IntegrationTestHelper.java   
private static void cleanUpIAM(Regions testRegion,String testResourcePrefix,Date createdBeforeThreshold,AWSCredentialsProvider awsCredentials) {
    AmazonIdentityManagement iamClient = AmazonIdentityManagementClientBuilder.standard()
        .withCredentials(awsCredentials)
        .withRegion(testRegion)
        .build();
    IAMPolicyManager iamPolicyManager = IAMPolicyManager.fromCredentials(awsCredentials,new ClientConfiguration());

    LOG.info("Cleaning IAM policies...");
    ListPoliciesRequest listPoliciesRequest = new ListPoliciesRequest().withPathPrefix(IAMPolicyManager.PATH_PREFIX);
    List<Policy> policies = iamClient.listPolicies(listPoliciesRequest).getPolicies();
    for (Policy policy: policies) {
        if (policy.getPolicyName().startsWith(testResourcePrefix) &&
                policy.getCreateDate().before(createdBeforeThreshold)) {
            LOG.info("Cleaning up policy: " + policy.getPolicyName());

            IAMPolicyName iamPolicyName = IAMPolicyName.fromString(policy.getPolicyName());
            iamPolicyManager.detachAllPrincipals(iamPolicyName.group);

            DeletePolicyRequest deletePolicyRequest = new DeletePolicyRequest().withPolicyArn(policy.getArn());
            iamClient.deletePolicy(deletePolicyRequest);
        }
    }

    LOG.info("Cleaning IAM roles created for the assume role tests...");
    ListRolesRequest listRolesRequest = new ListRolesRequest().withPathPrefix(IAMHelper.PATH);
    List<Role> roles = iamClient.listRoles(listRolesRequest).getRoles();
    for (Role role: roles) {
        if (role.getRoleName().startsWith(AssumedRoleTestContext.ROLE_PREFIX) &&
                role.getCreateDate().before(createdBeforeThreshold)) {
            LOG.info("Cleaning up role: " + role.getRoleName());
            DeleteRoleRequest deleteRoleRequest = new DeleteRoleRequest().withRoleName(role.getRoleName());
            iamClient.deleteRole(deleteRoleRequest);
        }
    }

}
项目:aws-doc-sdk-examples    文件:ListAccessKeys.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply an IAM  username\n" +
            "Ex: ListAccessKeys <username>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String username = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        boolean done = false;
        ListAccessKeysRequest request = new ListAccessKeysRequest()
                .withUserName(username);

        while (!done) {

            ListAccessKeysResult response = iam.listAccessKeys(request);

            for (AccessKeyMetadata Metadata :
                    response.getAccessKeyMetadata()) {
                System.out.format("Retrieved access key %s",Metadata.getAccessKeyId());
            }

            request.setMarker(response.getMarker());

            if (!response.getIsTruncated()) {
                done = true;
            }
        }
    }
项目:aws-doc-sdk-examples    文件:UpdateAccessKey.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a username,access key id and status\n" +
            "Ex: UpdateAccessKey <username> <access-key-id> <Activate|Inactive>\n";

        if (args.length != 3) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String username = args[0];
        String access_id = args[1];
        String status = args[2];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        UpdateAccessKeyRequest request = new UpdateAccessKeyRequest()
            .withAccessKeyId(access_id)
            .withUserName(username)
            .withStatus(status);

        UpdateAccessKeyResult response = iam.updateAccessKey(request);

        System.out.printf(
                "Successfully updated status of access key %s to" +
                "status %s for user %s",access_id,status,username);
    }
项目:aws-doc-sdk-examples    文件:UpdateServerCertificate.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply the current certificate name and\n" +
            "a new name. Ex:\n\n" +
            "UpdateServerCertificate <current-name> <new-name>\n";

        if (args.length != 2) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String cur_name = args[0];
        String new_name = args[1];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        UpdateServerCertificateRequest request =
            new UpdateServerCertificateRequest()
                .withServerCertificateName(cur_name)
                .withNewServerCertificateName(new_name);

        UpdateServerCertificateResult response =
            iam.updateServerCertificate(request);

        System.out.printf("Successfully updated server certificate to name %s",new_name);
    }
项目:aws-doc-sdk-examples    文件:ListServerCertificates.java   
public static void main(String[] args) {

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        boolean done = false;
        ListServerCertificatesRequest request =
                new ListServerCertificatesRequest();

        while(!done) {

            ListServerCertificatesResult response =
                iam.listServerCertificates(request);

            for(ServerCertificateMetadata Metadata :
                    response.getServerCertificateMetadataList()) {
                System.out.printf("Retrieved server certificate %s",Metadata.getServerCertificateName());
            }

            request.setMarker(response.getMarker());

            if(!response.getIsTruncated()) {
                done = true;
            }
        }
    }
项目:aws-doc-sdk-examples    文件:UpdateUser.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply the current username and a new\n" +
            "username. Ex:\n\n" +
            "UpdateUser <current-name> <new-name>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String cur_name = args[0];
        String new_name = args[1];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        UpdateUserRequest request = new UpdateUserRequest()
            .withUserName(cur_name)
            .withNewUserName(new_name);

        UpdateUserResult response = iam.updateUser(request);

        System.out.printf("Successfully updated user to username %s",new_name);
    }
项目:aws-doc-sdk-examples    文件:ListAccountAliases.java   
public static void main(String[] args) {

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        ListAccountAliasesResult response = iam.listAccountAliases();

        for (String alias : response.getAccountAliases()) {
            System.out.printf("Retrieved account alias %s",alias);
        }
    }
项目:aws-doc-sdk-examples    文件:DeleteUser.java   
public static void main(String[] args) {

        final String USAGE =
            "To run this example,supply a username\n" +
            "Ex: DeleteUser <username>\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String username = args[0];

        final AmazonIdentityManagement iam =
            AmazonIdentityManagementClientBuilder.defaultClient();

        DeleteUserRequest request = new DeleteUserRequest()
            .withUserName(username);

        try {
            iam.deleteUser(request);
        } catch (DeleteConflictException e) {
            System.out.println("Unable to delete user. Verify user is not" +
                    " associated with any resources");
            throw e;
        }

        System.out.println("Successfully deleted IAM user " + username);
    }
项目:cerberus-lifecycle-cli    文件:CerberusModule.java   
/**
 * Binds all the Amazon services used.
 */
@Override
protected void configure() {
    final Region region = Region.getRegion(Regions.fromName(regionName));
    bind(AmazonEC2.class).toInstance(createAmazonClientInstance(AmazonEC2Client.class,region));
    bind(AmazonCloudFormation.class).toInstance(createAmazonClientInstance(AmazonCloudFormationClient.class,region));
    bind(AmazonIdentityManagement.class).toInstance(createAmazonClientInstance(AmazonIdentityManagementClient.class,region));
    bind(AWSKMS.class).toInstance(createAmazonClientInstance(AWSKMSClient.class,region));
    bind(AmazonS3.class).toInstance(createAmazonClientInstance(AmazonS3Client.class,region));
    bind(AmazonAutoScaling.class).toInstance(createAmazonClientInstance(AmazonAutoScalingClient.class,region));
    bind(AWSSecurityTokenService.class).toInstance(createAmazonClientInstance(AWSSecurityTokenServiceClient.class,region));
    bind(AWSLambda.class).toInstance(createAmazonClientInstance(AWSLambdaClient.class,region));
    bind(AmazonSNS.class).toInstance(createAmazonClientInstance(AmazonSNSClient.class,region));
}
项目:aws-sdk-java-resources    文件:IdentityManagementImpl.java   
/**
 * Construct a service implementation using the specified client object.
 *
 * @param client The low-level client which the service implementation will
 *         use to make API calls.
 */
public IdentityManagementImpl(AmazonIdentityManagement client) {
    ServiceModel model = V1ModelLoader.load(IdentityManagement.class,IdentityManagement.class.getAnnotation(V1ServiceInterface.class).model());

    this.service = new ServiceImpl<AmazonIdentityManagement>(model,client);
}
项目:spring-cloud-aws    文件:AmazonRdsDataSourceUserTagsfactorybeanTest.java   
@Test
public void getobject_instanceWithTagsConfiguredWithCustomresourceResolverAndCustomregion_mapWithTagsReturned() throws Exception {
    //Arrange
    AmazonRDS amazonRds = mock(AmazonRDS.class);
    ResourceIdResolver resourceIdResolver = mock(ResourceIdResolver.class);
    AmazonIdentityManagement amazonIdentityManagement = mock(AmazonIdentityManagement.class);
    AmazonRdsDataSourceUserTagsfactorybean factorybean = new AmazonRdsDataSourceUserTagsfactorybean(amazonRds,"test",amazonIdentityManagement);
    factorybean.setResourceIdResolver(resourceIdResolver);
    factorybean.setRegion(Region.getRegion(Regions.EU_WEST_1));

    when(resourceIdResolver.resolvetoPhysicalResourceId("test")).thenReturn("stack-test");
    when(amazonIdentityManagement.getUser()).thenReturn(new GetUserResult().withUser(new User("/","aemruli","123456789012","arn:aws:iam::1234567890:user/aemruli",new Date())));
    when(amazonRds.listTagsForResource(new ListTagsForResourceRequest().withResourceName("arn:aws:rds:eu-west-1:1234567890:db:stack-test"))).thenReturn(new ListTagsForResourceResult().withTagList(
            new Tag().withKey("key1").withValue("value1"),new Tag().withKey("key2").withValue("value2")
    ));

    //Act
    factorybean.afterPropertiesSet();
    Map<String,String> userTagMap = factorybean.getobject();

    //Assert
    assertEquals("value1",userTagMap.get("key1"));
    assertEquals("value2",userTagMap.get("key2"));
}
项目:spring-cloud-aws    文件:AmazonRdsDataSourceUserTagsfactorybeanTest.java   
@Test
public void getobject_instanceWithOutTags_emptyMapReturned() throws Exception {
    //Arrange
    AmazonRDS amazonRds = mock(AmazonRDS.class);
    ResourceIdResolver resourceIdResolver = mock(ResourceIdResolver.class);
    AmazonIdentityManagement amazonIdentityManagement = mock(AmazonIdentityManagement.class);
    AmazonRdsDataSourceUserTagsfactorybean factorybean = new AmazonRdsDataSourceUserTagsfactorybean(amazonRds,amazonIdentityManagement);
    factorybean.setResourceIdResolver(resourceIdResolver);
    factorybean.setResourceIdResolver(resourceIdResolver);
    factorybean.setRegion(Region.getRegion(Regions.EU_WEST_1));

    when(resourceIdResolver.resolvetoPhysicalResourceId("test")).thenReturn("stack-test");
    when(amazonIdentityManagement.getUser()).thenReturn(new GetUserResult().withUser(new User("/",new Date())));
    when(amazonRds.listTagsForResource(new ListTagsForResourceRequest().withResourceName("arn:aws:rds:eu-west-1:1234567890:db:stack-test"))).thenReturn(new ListTagsForResourceResult());

    //Act
    factorybean.afterPropertiesSet();
    Map<String,String> userTagMap = factorybean.getobject();

    //Assert
    assertTrue(userTagMap.isEmpty());
}
项目:spring-cloud-aws    文件:AmazonRdsDataSourceUserTagsfactorybeanTest.java   
@Test
public void getobject_instanceWithTagsAndnoresourceIdResolverAndDefaultRegion_mapWithTagsReturned() throws Exception {
    //Arrange
    AmazonRDS amazonRds = mock(AmazonRDS.class);
    AmazonIdentityManagement amazonIdentityManagement = mock(AmazonIdentityManagement.class);

    AmazonRdsDataSourceUserTagsfactorybean factorybean = new AmazonRdsDataSourceUserTagsfactorybean(amazonRds,amazonIdentityManagement);


    when(amazonIdentityManagement.getUser()).thenReturn(new GetUserResult().withUser(new User("/",new Date())));
    when(amazonRds.listTagsForResource(new ListTagsForResourceRequest().withResourceName("arn:aws:rds:us-west-2:1234567890:db:test"))).thenReturn(new ListTagsForResourceResult().withTagList(
            new Tag().withKey("key1").withValue("value1"),userTagMap.get("key2"));
}
项目:spring-cloud-aws    文件:AmazonRdsDataSourceBeanDeFinitionParserTest.java   
@Test
public void parseInternal_userTagsDefined_createsUserTagBeanDeFinition() throws Exception {

    //Arrange
    DefaultListablebeanfactory beanfactory = new DefaultListablebeanfactory();

    BeanDeFinitionBuilder beanDeFinitionBuilder = BeanDeFinitionBuilder.rootBeanDeFinition(Mockito.class);
    beanDeFinitionBuilder.setFactoryMethod("mock");
    beanDeFinitionBuilder.addConstructorArgValue(AmazonRDS.class);
    beanfactory.registerBeanDeFinition(AmazonWebserviceClientConfigurationUtils.getBeanName(AmazonRDSClient.class.getName()),beanDeFinitionBuilder.getBeanDeFinition());

    BeanDeFinitionBuilder identityBuilder = BeanDeFinitionBuilder.rootBeanDeFinition(Mockito.class);
    identityBuilder.setFactoryMethod("mock");
    identityBuilder.addConstructorArgValue(AmazonIdentityManagement.class);
    beanfactory.registerBeanDeFinition(AmazonWebserviceClientConfigurationUtils.getBeanName(AmazonIdentityManagement.class.getName()),identityBuilder.getBeanDeFinition());

    XmlBeanDeFinitionReader xmlBeanDeFinitionReader = new XmlBeanDeFinitionReader(beanfactory);
    xmlBeanDeFinitionReader.loadBeanDeFinitions(new ClassPathResource(getClass().getSimpleName() + "-userTags.xml",getClass()));

    AmazonRDS client = beanfactory.getBean(AmazonWebserviceClientConfigurationUtils.getBeanName(AmazonRDSClient.class.getName()),AmazonRDS.class);
    AmazonIdentityManagement amazonIdentityManagement = beanfactory.getBean(AmazonWebserviceClientConfigurationUtils.getBeanName(AmazonIdentityManagement.class.getName()),AmazonIdentityManagement.class);

    when(amazonIdentityManagement.getUser()).thenReturn(new GetUserResult().withUser(new User("/",new Date())));
    when(client.listTagsForResource(new ListTagsForResourceRequest().withResourceName("arn:aws:rds:us-west-2:1234567890:db:test"))).thenReturn(new ListTagsForResourceResult().withTagList(
            new Tag().withKey("key1").withValue("value2")
    ));

    //Act
    Map<?,?> dsTags = beanfactory.getBean("dsTags",Map.class);

    //Assert
    assertEquals("value2",dsTags.get("key1"));
}
项目:s3-cf-service-broker    文件:Iam.java   
@Autowired
public Iam(AmazonIdentityManagement iam,BucketGroupPolicy bucketGroupPolicy,@Value("${GROUP_PATH:/cloud-foundry/s3/}") String groupPath,@Value("${GROUP_NAME_PREFIX:cloud-foundry-s3-}") String groupNamePrefix,@Value("${POLICY_NAME_PREFIX:cloud-foundry-s3-}") String policyNamePrefix,@Value("${USER_PATH:/cloud-foundry/s3/}") String userPath,@Value("${USER_NAME_PREFIX:cloud-foundry-s3-}") String userNamePrefix) {
    this.iam = iam;
    this.bucketGroupPolicy = bucketGroupPolicy;
    this.groupPath = groupPath;
    this.groupNamePrefix = groupNamePrefix;
    this.policyNamePrefix = policyNamePrefix;
    this.userPath = userPath;
    this.userNamePrefix = userNamePrefix;
}
项目:s3-cf-service-broker    文件:BasicPlanIam.java   
@Autowired
public BasicPlanIam(AmazonIdentityManagement iam,@Value("${USER_NAME_PREFIX:cloud-foundry-s3-}") String userNamePrefix) {
    super(iam,bucketGroupPolicy,groupPath,groupNamePrefix,policyNamePrefix,userPath,userNamePrefix);
}
项目:cloudbreak    文件:AwsSetup.java   
private boolean checkIamOrS3Access(AmazonIdentityManagement client,AttachedPolicy attachedPolicy) {
    GetPolicyRequest getRolePolicyRequest = new GetPolicyRequest();
    getRolePolicyRequest.setPolicyArn(attachedPolicy.getPolicyArn());
    GetPolicyResult policy = client.getPolicy(getRolePolicyRequest);
    if (policy.getPolicy().getArn().toLowerCase().contains("iam")) {
        LOGGER.info("Role has policy for iam resources: {}.",policy.getPolicy().getArn());
        return true;
    }
    return false;
}
项目:cloudbreak    文件:AwsPlatformResources.java   
@Override
public CloudAccessConfigs accessConfigs(CloudCredential cloudCredential,Region region,Map<String,String> filters) throws Exception {
    String queryFailedMessage = "Could not get instance profile roles from Amazon: ";

    CloudAccessConfigs cloudAccessConfigs = new CloudAccessConfigs(new HashSet<>());
    AwsCredentialView awsCredentialView = new AwsCredentialView(cloudCredential);
    AmazonIdentityManagement client = awsClient.createAmazonIdentityManagement(awsCredentialView);
    try {
        ListInstanceProfilesResult listRolesResult = client.listInstanceProfiles();
        for (InstanceProfile instanceProfile : listRolesResult.getInstanceProfiles()) {
            Map<String,Object> properties = new HashMap<>();
            properties.put("arn",instanceProfile.getArn());
            properties.put("creationDate",instanceProfile.getCreateDate().toString());
            if (!instanceProfile.getRoles().isEmpty()) {
                String roleName = instanceProfile.getRoles().get(0).getArn();
                properties.put("roleArn",Strings.isNullOrEmpty(roleName) ? instanceProfile.getArn() : roleName);
            }
            cloudAccessConfigs.getCloudAccessConfigs().add(
                    new CloudAccessConfig(
                            instanceProfile.getInstanceProfileName(),instanceProfile.getInstanceProfileId(),properties));
        }
    } catch (AmazonServiceException ase) {
        if (ase.getStatusCode() == UNAUTHORIZED) {
            String policyMessage = "Could not get instance profile roles because the user does not have enough permission.";
            LOGGER.info(policyMessage + ase);
            throw new CloudConnectorException(policyMessage,ase);
        } else {
            LOGGER.error(queryFailedMessage,ase);
            throw new CloudConnectorException(queryFailedMessage + ase.getMessage(),ase);
        }
    } catch (Exception e) {
        LOGGER.error(queryFailedMessage,e);
        throw new CloudConnectorException(queryFailedMessage + e.getMessage(),e);
    }
    return cloudAccessConfigs;
}
项目:aws-sdk-first-steps    文件:Launcher.java   
private static void setup(AmazonS3 storage,AmazonSQS queue,AmazonEC2 machines,AmazonIdentityManagement identityManagement) throws IOException {
    S3Utils.checkCreateBucket(storage,CODE_MYPROJECT_COM); // Moved in local machine running code to avoid permission denied on EC2 machines
    SQSUtils.checkCreateQueues(queue,INPUT_QUEUE,REPORT_QUEUE);

    S3Utils.upload(storage,new FileInputStream("./target/" + JAR_FILE),CODE_MYPROJECT_COM,JAR_FILE,"application/java-archive",CannedAccessControlList.Private);

    String profileArn = IamUtils.setupRunnerSecurity(identityManagement,SQSUtils.getQueueArn(queue,INPUT_QUEUE),REPORT_QUEUE));
    Ec2Utils.run(machines,"./shell/startupScript.sh",NUMBER_OF_MACHInes,profileArn);
}
项目:clouck    文件:IamWrapperImpl.java   
private AmazonIdentityManagement findClient(String accessKeyId,String secretAccessKey) {
        // Todo: need to config client config parameter. ignore it for Now.
        AWSCredentials credential = new BasicAWSCredentials(accessKeyId,secretAccessKey);
        AmazonIdentityManagement iam = new AmazonIdentityManagementClient(credential);
//        iam.setEndpoint(Region.toIamEndpoint());
        return iam;
    }

EJB之JPA(EntityManager)

EJB之JPA(EntityManager)

 

 

基本概念

EntityManager称为实体管理器,它由EntityManagerFactory所创建。EntityManagerFactory,作为EntityManager的工厂,包含有当前O-R映射的元数据信息,每个EntityManagerFactory,可称为一个持久化单元(PersistenceUnit),每个持久化单元可认为是一个数据源的映射(所谓数据源,可理解为一个数据库,我们可以在应用服务器中配置多个数据源,同时使用不同的PersistenceUnit来映射这些数据源,从而能够很方便的实现跨越多个数据库之间的事务操作!)

 

       PersistenceContext,称为持久化上下文,它一般包含有当前事务范围内的,被管理的实体对象(Entity)的数据。每个EntityManager,都会跟一个PersistenceContext相关联。PersistenceContext中存储的是实体对象的数据,而关系数据库中存储的是记录,EntityManager正是维护这种OR映射的中间者,它可以把数据从数据库中加载到PersistenceContext中,也可以把数据从PersistenceContext中持久化到数据库,EntityManager通过Persist、merge、remove、refresh、flush等操作来操纵PersistenceContext与数据库数据之间的同步!

       EntityManager是应用程序操纵持久化数据的接口。它的作用与hibernate session类似。为了能够在一个请求周期中使用同一个session对象,在hibernate的解决方案中,提出了currentSession的概念,hibernate中的current session,可以跟JTA事务绑定,也可以跟当前线程绑定。在hibernate中,session管理着所有的持久化对象的数据。而在EJB3中,EntityManager管理着PersistenceContext,PersistenceContext正是被管理的持久化对象的集合。

       在Java EE环境下,一个JTA事务通常会横跨多个组件的调用(比如多个EJB组件的方法调用)。这些组件需要能够在单个事务范围内访问到同样的Persistence Context。为了满足这种情况的需要,当EntityManager被注入或通过jndi被查询的时候,它的Persistence Context将会在当前事务范围内自动传播,引用到同一个Persistence unit的EntityManager将使用同样的Persistence Context。这可以避免在不同的组件之间传递EntityManager引用。

 

通过容器来传递PersistenceContext,而不是应用程序自己来传递EntityManager。这种方式(由容器管理着PersistenceContext,并负责传递到不同的EntityManager)称为容器管理的实体管理器(Container-Managed EntityManager),它的生命周期由容器负责管理。

 

有一种不常见的情况是,应用程序自身需要独立访问Persistence Context。即每次创建一个EntityManager都会迫使创建一个新的Persistence Context。这些Persistence Context即使在同一个事务范围内也不会跟其它EntityManager共享!这个创建过程可以由EntityManagerFactory的createEntityManager方法来创建。这被称为应用管理的实体管理器(application-managed entity manager)。

底层事务控制

EntityManager的底层可以使用JTA或RESOURCE_LOCAL类型的事务控制策略。JTA一般在容器环境中使用,而RESOURCE_LOCAL一般在J2SE的环境下使用。

比如,在J2SE的环境下,由应用程序自身来创建EntityManagerFactory,并由EntityManagerFactory创建EntityManager,通过EntityManager.getTransaction.begin()方法来开启事务,commit()方法提交事务等等,这种方式就是RESOURCE_LOCAL的基本使用方法。

最常用的就是在容器环境下使用。也就是使用JTA类型的EntityManager,这样,EntityManager的调用都是在一个外部的JTA事务环境下进行的。

Container-Managed EntityManager必须是JTA类型的EntityManager,而Application-Managed EntityManager则既可以是JTA类型的EntityManager,也可以是RESOURCE_LOCAL类型的EntityManager。

配置示例:

<persistence-unit name="test" transaction-type="JTA">

Container-Managed Persistence Context

    @PersistenceContext(unitName="test")

    private EntityManager em;

persistence context的生命周期对应用程序来说,总是被自动、透明的管理着的。也就是对应用程序本身来说,它对persitence context的创建、销毁一无所知,完全自动和透明。Persistence context随着JTA事务而传播。

 

一个容器管理的persistence context (即container-managed persistence context)可以被限定为单个事务范围,或,扩展其生存期跨越多个事务!这取决于当它的entity manager被创建的时候所定义的PersistenceContextType类型。它可以取值为TRANSACTION和EXTENDED。可称为:事务范围的persistence context或扩展的persistence context。

 

Persistence context总是会关联到一个entity manager factory。

 

-          Transaction-scope persistence context

当entity manager的方法被调用的时候,如果在当前JTA事务中还没有persistence context,那么将启动一个新的persistence context ,并将它跟当前的JTA事务关联。

-          Extended persistence context

扩展的persistence context 总是跟stateful session bean绑定在一起。当在stateful session bean中注入entity manager,并定义为extended persistence context时,从我们开始调用stateful session bean开始,直到stateful session bean被销毁(移除)!通常,这可以通过调用一个在stateful session bean中被注解定义为@Remove的方法来结束一个stateful session bean的生命周期。

 

Application-Managed Persistence Context

即当我们自己创建EntityManager的时候,我们通过entityManager.close() / isOpen()方法来管理entityManager及其对应的persistence context.

 

实体对象的生命周期

几种类型:New,managed,detached,removed

 

New – 即未有id值,尚未跟persistence context建立关联的对象

Managed – 有id值,已跟persistence context建立了关联

Detached – 有id值,但没有(或不再)跟persistence context建立关联

Removed – 有id值,而且跟persistence context尚有关联,但已准备好要从数据库中把它删除。

 

EntityManager的接口方法

 

添加:调用persist方法

* 将把一个对象持久化,如果对象的ID非空,则在调用persist方法时将抛出异常,无法持久化

 

删除:remove方法

不能直接new一个对象,然后给它的id赋值,然后删除。要删除一个对象,这个对象必须是处于持久化状态。

 

更新:merge方法

 

Find – 查找某个对象,如果查不到该对象,将返回null,相当于get

 

getReference – 查找某个对象,如果查找不到该对象,将抛出异常,相当于load

 

flush – 将实体对象由persistence context同步到底层的数据库

l  FlushMode

n  Auto – 即在同一个事务中,在查询发生前,将自动把数据从PersistenceContext持久化到数据库中。

n  Commit – 只在提交的时候,把数据从PersistenceContext中持久化到数据库中。如果设置FlushMode为commit,那么在同一个事务中,在查询之前,如果有更新的数据,这些数据是否会影响到查询的结果,这种情况,EJB3未作说明。

 

Lock – 锁定某个实体对象

实际上就是定义事务的隔离级别。总共有两种形式:READ和WRITE,表示:

不管是READ还是WRITE,都应该能够避免脏读(读到另外一个事务未提交的数据)和不可重复读(同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。)

而对于WRITE来说,还应该能够强迫版本号的增加(对那些标识了版本的对象而言)。因此,其它事务无法对其做任何更改操作!

 

Refresh – 将数据从数据库中加载到Persistenc Context。

 

Clear – 清除Persistence Context中缓存的实体对象数据

 

Contains – 测试当前Persistence Context中是否包含某实体对象

 

实体对象的监听器和回调方法

@PrePersist(在保存之前)等注解,可以被定义到Entity Bean的某些方法上面,定义其回调方法。(请参考persistenc规范3.5.1)

 

 

 

这些方法既可以被定义到Entity Bean上面,也可以被定义到Entity Listener类的方法上。

 

 

拦截器

@Interceptors(InterceptorForStudent1Manager.class)

public class StudentManagerImpl implements StudentManager {

 

 

public class InterceptorForStudent1Manager {

   

    @AroundInvoke

    public Object doit(InvocationContext context) throws Exception{

       System.out.println("将要开始执行方法:"+context.getMethod().getName());

       Object obj = context.proceed();

       System.out.println("方法"+context.getMethod().getName()+"已被成功执行");

       return obj;

    }

}

 

 

将Interceptors定义到类或特定方法上面可以对类的所有方法或特定方法的调用进行拦截!

 

EntityManager实例操作介绍

EJB3如何实现继承关系的映射?

继承关系的映射,总共有三种策略,与Hibernate类似

 

1、SINGLE_TABLE策略:整个类继承树对应的对象都存放在一张表

 

父类定义:

@Entity

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)

@DiscriminatorColumn(name="animalType")

@DiscriminatorValue("A")

public class Animal {

 

 

子类定义:

 

@Entity

@DiscriminatorValue(value="B")

public class Bird extends Animal{

 

 

2、JOINED策略:父类和子类都对应不同的表,子类中只存在其扩展的特殊的属性(不包含

父类的属性)

 

父类定义:

@Entity

@Inheritance(strategy=InheritanceType.JOINED)

public class Animal {

 

 

子类定义:

@Entity

public class Bird extends Animal{

 

 

3、TABLE_PER_CLASS策略:父类和子类都对应不同的表,子类中存在所有的属性(包含从

父类继承下来的所有属性)

@Entity

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

public class Animal {

 

 

子类定义:

@Entity

public class Bird extends Animal{

 

 

如何注入EntityManager对象?

1、首先要确保persistence.xml中已定义了相应的persistence-unit,比如:

<?xml version="1.0" encoding="UTF-8"?>

<persistence xmlns="http://java.sun.com/xml/ns/persistence"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence

    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">

    <persistence-unit name="test" transaction-type="JTA">

        <jta-data-source>java:/MySqlDS</jta-data-source>

        <properties>

           <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>

          <property name="hibernate.hbm2ddl.auto" value="create"/>

          <property name="hibernate.show_sql" value="true"/>

        </properties>

    </persistence-unit>

</persistence>

 

 

2、在session bean中,直接定义EntityManager,并使用@PersistenceContext注解注入即可:

@Stateless(name="userManager")

public class UserManagerImpl implements UserManager {

 

    /**

     * 如果只定义了一个Persistence Unit,则无需指定unitName,但一旦定义了

     * 多个,则必须指定unitName

     */

    @PersistenceContext(unitName="test")

    private EntityManager em;

 

 

如何知道有哪些实体类?或哪些实体类将要被映射到数据库表?

我们学习hibernate的时候知道,hibernate有一个hibernate.cfg.xml,可以在这个文件中指定哪些实体类将要被映射到数据库表。那么EJB3中,是如何指定的呢?默认情况下,会将EJB JAR包中的所有被定义了@Entity注解的类映射到数据库表。我们也可以通过下列方法来指定要映射的类:

    

<persistence-unit name="test" transaction-type="JTA">

        <jta-data-source>java:/MySqlDS</jta-data-source>

        <class>com.bjsxt.jpa.User</class>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>

        <properties>

           <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>

          <property name="hibernate.hbm2ddl.auto" value="create"/>

          <property name="hibernate.show_sql" value="true"/>

        </properties>

    </persistence-unit>

 

正如这里所表示的一样,使用<class>标签和<exclude-unlisted-classes>标签的联合使用,可以指定我们要映射的实体类。

 

如何由应用程序来管理EntityManager?

我们一般情况下,都不需要由应用程序自身来管理EntityManager,最好就是使用容器管理的EntityManager对象。但某些特殊情况下,我们可能想要由应用程序本身来管理它,那么,可以采取如下方法来办到这一点。

1、注入EntityManagerFactory对象

  

/**

     * 也可以注入EntityManagerFactory,手工管理PersistenceContext

     */

    @PersistenceUnit(unitName="test")

    private EntityManagerFactory factory;

 

 

2、在程序中,用factory来创建和管理EntityManager对象

     

EntityManager em = factory.createEntityManager();

      

       Student student = new Student();

       student.setName("张三");

       em.persist(student);

      

       em.close();

 

 

如何利用JTA实现跨越多个数据库的事务控制(一)?

JTA 本身就支持跨越多个数据库的事务控制。要实现这一点,我们需要有如下步骤:

1、  首先是数据源的配置,为了支持两个以上的数据库,我们必须针对每个数据库单独配置它的数据源,下面是配置了两个MySQL数据库的示例:

<datasources>

  <local-tx-datasource>

    <jndi-name>MySqlDS</jndi-name>

    <connection-url>jdbc:mysql://localhost:3306/ejb3</connection-url>

    <driver-class>com.mysql.jdbc.Driver</driver-class>

    <user-name>root</user-name>

    <password>mysql</password>

    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>

   

    <metadata>

       <type-mapping>mySQL</type-mapping>

    </metadata>

</local-tx-datasource>

 

  <local-tx-datasource>

    <jndi-name>MySqlDS2</jndi-name>

    <connection-url>jdbc:mysql://localhost:3306/ejb4</connection-url>

    <driver-class>com.mysql.jdbc.Driver</driver-class>

    <user-name>root</user-name>

    <password>mysql</password>

    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>

    <metadata>

       <type-mapping>mySQL</type-mapping>

    </metadata>

  </local-tx-datasource>

</datasources>

 

2、其次,在persistence.xml中,可以定义两个以上的persistence-unit配置:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence

    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">

    <!-- transaction-type 也可以取值为RESOURCE_LOCAL  -->

    <!--

    如果在一个EJB JAR包内定义了两个以上的persistence-unit,则在这个EJB JAR包内的所有实体类,将

    同时映射到这两个persistence-unit所代表的数据库中!

    -->

    <persistence-unit name="test" transaction-type="JTA">

        <jta-data-source>java:/MySqlDS</jta-data-source>

        <class>com.bjsxt.jpa.User</class>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>

        <properties>

           <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>

          <property name="hibernate.hbm2ddl.auto" value="create"/>

          <property name="hibernate.show_sql" value="true"/>

        </properties>

    </persistence-unit>

    <persistence-unit name="test2" transaction-type="JTA">

        <jta-data-source>java:/MySqlDS2</jta-data-source>

        <class>com.bjsxt.jpa.Person</class>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>

        <properties>

           <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>

          <property name="hibernate.hbm2ddl.auto" value="create"/>

          <property name="hibernate.show_sql" value="true"/>

        </properties>

    </persistence-unit>

</persistence>

 

 

3、编写SESSION BEAN

 

@Stateless(name="userManager")

public class UserManagerImpl implements UserManager {

 

    /**

     * 如果只定义了一个Persistence Unit,则无需指定unitName,但一旦定义了

     * 多个,则必须指定unitName

     */

    @PersistenceContext(unitName="test")

    private EntityManager em;

   

    @PersistenceContext(unitName="test2")

    private EntityManager em2;

   

    public void addUser() {

       User user = new User();

       user.setName("张三");

       em.persist(user);

      

       Person person = new Person();

       person.setName("Test Person");

       em2.persist(person);

      

       //如果抛出异常,将会导致整个事务回滚!这就是跨越数据库的事务管理

       throw new RuntimeException("随便一个异常");

    }

 

}

 

 

 

如何利用JTA实现跨越多个数据库的事务控制(二)?

下面,我们的例子是,利用JTA的能力,在同一个session bean的事务中同时操纵mysql和Oracle的数据库,一样可以实现事务的管理。

 

整体过程与上面所述的过程是一样的,只是具体的实现不同而已:

1、  配置mysql的数据源(请参考上述配置)

2、  配置oracle的数据源(请参考JBOSS中相应的数据源配置模板,注意,需要拷贝oracle的数据库驱动到jboss/server/default/lib下面)

3、  配置persistence.xml,示例如下:

<?xml version="1.0" encoding="UTF-8"?>

<persistence xmlns="http://java.sun.com/xml/ns/persistence"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence

    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">

    <!-- transaction-type 也可以取值为RESOURCE_LOCAL  -->

    <!--

    如果在一个EJB JAR包内定义了两个以上的persistence-unit,则在这个EJB JAR包内的所有实体类,将

    同时映射到这两个persistence-unit所代表的数据库中!

    -->

    <persistence-unit name="mysql" transaction-type="JTA">

        <jta-data-source>java:/MySqlDS</jta-data-source>

        <class>com.bjsxt.jpa.User</class>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>

        <properties>

           <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>

          <property name="hibernate.hbm2ddl.auto" value="create"/>

          <property name="hibernate.show_sql" value="true"/>

        </properties>

    </persistence-unit>

    <persistence-unit name="oracle" transaction-type="JTA">

        <jta-data-source>java:/OracleDS</jta-data-source>

        <class>com.bjsxt.jpa.Person</class>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>

        <properties>

           <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9Dialect"/>

          <property name="hibernate.hbm2ddl.auto" value="create"/>

          <property name="hibernate.show_sql" value="true"/>

        </properties>

    </persistence-unit>

</persistence>

 

 

 

4、  编写测试的session bean

 

@Stateless(name="userManager")

public class UserManagerImpl implements UserManager {

 

    @PersistenceContext(unitName="mysql")

    private EntityManager mysql;

   

    @PersistenceContext(unitName="oracle")

    private EntityManager oracle;

   

    public void addUser() {

       for(int i=0; i<10; i++){

           User user = new User();

           user.setName("张三"+i);

           mysql.persist(user);

       }

      

       for(int i=0; i<10; i++){

           Person person = new Person();

           person.setName("Person"+i);

           oracle.persist(person);

       }

      

       throw new RuntimeException("随便一个异常!");

    }

 

}

 

 

 

在声明式事务管理中,如何控制事务的回滚?

在spring中,我们知道,默认情况下,抛出RuntimeException及其子类,将会导致事务的回滚,当然也可以定义rollback-for属性或not-rollback-for属性来指定相应的异常类是回滚或不回滚。

在EJB3中,回滚的策略是:

1、  默认情况下,抛出RuntimeException及其子类将导致事务回滚,其它异常不会回滚。

2、  我们可以定义一个自己的异常类,然后定义这个异常类用注解定义为ApplicationException,指定它的回滚特性即可。

 

先看一段代码:

public class MyException extends Exception {

 

public class MyException1 extends RuntimeException {

 

    public void addMultiPerson() throws Exception {

      

       for(int i=0; i< 10; i++){

           Person4 person = new Person4();

           person.setName("P"+i);

           em.persist(person);

          

           if(i == 5){

              //默认情况下,抛出Exception及其子类不会进行回滚

              //throw new MyException("抛出MyException");

             

              //默认情况下,抛出RuntimeException及其子类会进行回滚

              throw new MyException1("抛出MyException1");

           }

       }

      

    }

 

在上面这段代码中,已经说得非常清楚了。这是EJB3默认的回滚特性演示。

那么,如何改变这种默认策略呢?请看如下代码:

@ApplicationException(rollback=true)

public class MyException extends Exception {

 

@ApplicationException(rollback=false)

public class MyException1 extends RuntimeException {

 

    public void addMultiPerson() throws Exception {

      

       for(int i=0; i< 10; i++){

           Person4 person = new Person4();

           person.setName("P"+i);

           em.persist(person);

          

           if(i == 5){

              //在MyException上定义ApplicationException,并设置rollback=true,会导致抛出异常的时候,事务的回滚

              //throw new MyException("抛出MyException");

             

              //在MyException1上定义ApplicationException,并设置rollback=false,会导致抛出异常的时候,事务不回滚

              throw new MyException1("抛出MyException1");

           }

       }

      

    }

 

 

 

 

如何定义事务的传播特性?

在容器管理的事务中,我们可以定义事务的传播特性。

事务传播特性是指,当事务跨越多个组件的方法调用时,如何将事务由上级调用传送到下级中去:

Not Supported – 不支持,如果当前有事务上下文,将挂起当前的事务

Supports - 支持,如果有事务,将使用事务,如果没有事务,将不使用事务

Required - 需要,如果当前有事务上下文,将使用当前的上下文事务,如果没有,将创建新的事务

Required New - 需要新的事务,如果当前有事务上下文,将挂起当前的事务,并创建新的事务去执行任务,执行完成之后,再恢复原来的事务

Mandatory - 当前必须要有事务上下文,如果当前没有事务,将抛出异常

Never - 当前必须不能有事务上下文,如果有事务,将抛出异常

 

可通过@TransactionAttribute注解来定义

 

如何监听实体对象的调用?

需求是:在存储一个实体对象之后,需要主动触发调用一段代码

实现过程是:

1、假设我们要监控Student对象的调用,那么监听器可以如下编写:

public class MyMonitor {

   

    /**

     * 必需带一个参数!!!!否则部署不会成功!

     * 添加了Listener之后,JBoss需要重新启动!!

     * @param student

     */

    @PostLoad

    public void dosomething(Student student){

       System.out.println("实体对象已经被成功加载!!!!!!name = "+ student.getName());

    }

}

 

2、只需要在Student实体类中指定我们要采用哪个类作为监听器即可

@Entity

@EntityListeners(MyMonitor.class)

public class Student implements Serializable{

 

 

如何拦截session bean的方法调用?

需求是:我们想要拦截某个session bean的方法调用,可能要在拦截器中增加日志记录或安全控制之类的代码(在spring中,我们可以通过AOP来做到这一点)

实现过程是:

1、首先实现一个拦截器类

public class InterceptorForStudent1Manager {

   

    @AroundInvoke

    public Object doit(InvocationContext context) throws Exception{

       System.out.println("将要开始执行方法:"+context.getMethod().getName());

       Object obj = context.proceed();

       System.out.println("方法"+context.getMethod().getName()+"已被成功执行");

       return obj;

    }

}

 

2、在session bean 上如下定义即可:

@Stateless(name="Student1Manager")

@Remote

@Interceptors(InterceptorForStudent1Manager.class)

public class Student1ManagerImpl implements Student1Manager {

 

 

 

 

 

 

我们今天的关于当我们需要多个EntityManager时?的分享就到这里,谢谢您的阅读,如果想了解更多关于com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder的实例源码、com.amazonaws.services.identitymanagement.AmazonIdentityManagementClient的实例源码、com.amazonaws.services.identitymanagement.AmazonIdentityManagement的实例源码、EJB之JPA(EntityManager)的相关信息,可以在本站进行搜索。

此处将为大家介绍关于如何-Spring IoC和HttpClient 4.3.1 CloseableHttpClient?的详细内容,并且为您解答有关spring http客户端的相关问题,此外,我们还将为您介绍关于Android HttpClient,DefaultHttpClient,HttpPost、CloseableHttpClient 调用 Post 的时候 StringEntity 字符集、CloseableHttpClient加载证书来访问https网站、CloseableHttpClient没设置超时时间引发的血案的有用信息。

本文目录一览:

如何-Spring IoC和HttpClient 4.3.1 CloseableHttpClient?(spring http客户端)

如何-Spring IoC和HttpClient 4.3.1 CloseableHttpClient?(spring http客户端)

我想让Spring IoC配置一个CloseableHttpClient对象并将其注入到我的类中,以便可以通过XML对其配置进行自定义。

从我看到的情况来看,HttpClient似乎非常有力地抵制了这种模式。他们希望您做类似的事情

CloseableHttpClient chc =    HttpClients.custom().set<thing that should be a property>().build();

ck

没有可以用来制作单例CloseableHttpClientbean的机制吗?

答案1

小编典典

这似乎为我工作:

<bean id="requestConfigBuilder"factory-method="custom">    <property name="socketTimeout" value="${socketTimeoutInMillis}" />     <property name="connectTimeout" value="${connectionTimeoutInMillis}" /> </bean><bean id="requestConfig" factory-bean="requestConfigBuilder" factory-method="build" /><bean id="httpClientBuilder"factory-method="create">    <property name="defaultRequestConfig" ref="requestConfig" /></bean><bean id="httpClient" factory-bean="httpClientBuilder" factory-method="build" />

这使我在“ httpClient”
bean中获得一个CloseableHttpClient,并配置了套接字和连接超时。您应该能够将更多属性添加到requestConfigBuilder或httpClientBuilder中。

Android HttpClient,DefaultHttpClient,HttpPost

Android HttpClient,DefaultHttpClient,HttpPost

我如何将字符串数据( JSONObject.toString())发送到URL.我想在util类中编写一个静态方法来执行此操作.我希望方法签名如下

public static String postData(String url,String postData)抛出SomeCustomException

字符串url的格式应该是什么

返回String是来自服务器的响应,作为json数据的字符串表示.

编辑

目前的连接工具

package my.package;
import my.package.exceptions.CustomException;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URLDecoder;

import org.apache.http.httpentity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;


 public class ConnectionUtil {

 public static String postData(String url,String postData)
        throws CustomException {

    // Create a new HttpClient and Post Header
    InputStream is = null;
    StringBuilder sb = null;
    String result = "";
    HttpClient httpclient = new DefaultHttpClient();

HttpPost httppost = new HttpPost();
    httppost.setHeader("host",url);

    Log.v("ConnectionUtil","opening POST connection to URI = " + httppost.getURI() + " url = " + URLDecoder.decode(url));

    try {
        httppost.setEntity(new StringEntity(postData));

        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);
        httpentity entity = response.getEntity();
        is = entity.getContent();

    } catch (Exception e) {
        Log.e("log_tag","Error in http connection " + e.toString());
        e.printstacktrace();
        throw new CustomException("Could not establish network connection");
    }
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is,"utf-8"),8);
        sb = new StringBuilder();
        sb.append(reader.readLine() + "\n");
        String line = "0";

        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }

        is.close();
        result = sb.toString();

    } catch (Exception e) {
        Log.e("log_tag","Error converting result " + e.toString());
        throw new CustomException("Error parsing the response");
    }
    Log.v("ConnectionUtil","Sent: "+postData);
    Log.v("ConnectionUtil","Got result "+result);
    return result;

}

}

Logcat输出

10-16 11:27:27.287: E/log_tag(4935): Error in http connection java.lang.NullPointerException
10-16 11:27:27.287: W/System.err(4935): java.lang.NullPointerException
10-16 11:27:27.287: W/System.err(4935): at org.apache.http.impl.client.AbstractHttpClient.determineTarget(AbstractHttpClient.java:496)
10-16 11:27:27.307: W/System.err(4935): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
10-16 11:27:27.327: W/System.err(4935): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
10-16 11:27:27.327: W/System.err(4935): at in.gharpay.zap.integration.ConnectionUtil.postData(ConnectionUtil.java:92)
10-16 11:27:27.327: W/System.err(4935): at in.gharpay.zap.integration.ZapTransaction$1.doInBackground(ZapTransaction.java:54)
10-16 11:27:27.327: W/System.err(4935): at in.gharpay.zap.integration.ZapTransaction$1.doInBackground(ZapTransaction.java:1)
10-16 11:27:27.327: W/System.err(4935): at android.os.AsyncTask$2.call(AsyncTask.java:185)
10-16 11:27:27.327: W/System.err(4935): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
10-16 11:27:27.327: W/System.err(4935): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
10-16 11:27:27.327: W/System.err(4935): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
10-16 11:27:27.327: W/System.err(4935): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
10-16 11:27:27.327: W/System.err(4935): at java.lang.Thread.run(Thread.java:1019)
10-16 11:27:27.327: V/log_tag(4935): Could not establish network connection

解决方法

我认为在您的代码中,基本问题是由您使用StringEntity将参数POST到网址的方式引起的.检查以下代码是否有助于使用StringEntity将数据发布到服务器.
// Build the JSON object to pass parameters
    JSONObject jsonObj = new JSONObject();
    jsonObj.put("username",username);
    jsonObj.put("data",dataValue);

    // Create the POST object and add the parameters
    HttpPost httpPost = new HttpPost(url);
    StringEntity entity = new StringEntity(jsonObj.toString(),HTTP.UTF_8);
    entity.setContentType("application/json");
    httpPost.setEntity(entity);

    HttpClient client = new DefaultHttpClient();
    HttpResponse response = client.execute(httpPost);

希望这有助于解决您的问题.谢谢.

CloseableHttpClient 调用 Post 的时候 StringEntity 字符集

CloseableHttpClient 调用 Post 的时候 StringEntity 字符集

在默认情况下 CloseableHttpClient 调用会使用 StringEntity 来设置字符串。

在设置好字符串后,我们会发送到远程 API 上进行执行。

比如说,我们可以先初始化 HttpPost 对象,然后设置 setEntity

HttpPost httpPost = new HttpPost("https://www.ossez.com/posts.json");
httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8"); 

下一步是初始化发送的 JSON 数据内容:

StringEntity postingString = new StringEntity(new Gson().toJson(topicRequest),  StandardCharsets.UTF_8); 

然后将 JSON 数据内容设置到 HttpPost 实体中

httpPost.setEntity(postingString); 

在这里有一个地方是需要注意的就是在设置 StringEntity 字符集的时候需要使用 UTF_8。

如果你不设置这个参数,默认是使用 ISO-8859-1 字符集的。

HttpPost-utf-8

很多时候针对中文的环境都会使用到中文,ISO-8859-1 字符集是不能支持中文的,一般来说我们只要确保所有的发送数据都使用 UTF-8 就可以了。

https://www.ossez.com/t/closeablehttpclient-post-stringentity/8401

CloseableHttpClient加载证书来访问https网站

CloseableHttpClient加载证书来访问https网站

         对安全性有要求的网站一般使用https来加密传输的请求和响应。https离不开证书,关于证书不在多说。Apache的HttpClient支持https,

下面是官方的样例程序,程序中使用了my.store这个文件,

这个文件不是网站的证书,而是一份包含自己密码的自己的证书库。这个文件是需要自己生成的,使用jdk中的keytool命令可以很方便的生成my.store文件。步骤如下(以支付宝为例):

  1. 浏览器(以chrome为例)访问https://www.alipay.com/,点击域名左侧的小锁,可以查看支付宝的证书信息


  2. 将支付包的证书信息导出,证书格式有很多中,der、cer等。随便选择即可。

  3. 命令行或者shell执行 keytool     -import -alias "my alipay cert" -file www.alipay.com.cert     -keystore my.store,

如果keytool命令不识别,去检查一下jdk的环境变量是否设置正确。”my alipay cert”是个别名,随便取。“www.alipay.com.cert”这个文件就是从浏览器中导出的支付宝的证书。

“my.store”是生成的自己 的证书库文件。回车执行,效果如下:



OK,现在可以执行下面的代码了:

    package com.yeetrack.httpclient;

    /**

    * Created with IntelliJ IDEA.

    * User: victor

    * Date: 13-10-11

    * Time: 下午3:09

    * To change this template use File | Settings | File Templates.

    */

    import java.io.File;

    import java.io.FileInputStream;

    import java.security.KeyStore;

    import javax.net.ssl.SSLContext;

    import org.apache.http.HttpEntity;

    import org.apache.http.client.methods.CloseableHttpResponse;

    import org.apache.http.client.methods.HttpGet;

    import org.apache.http.conn.ssl.SSLContexts;

    import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

    import org.apache.http.impl.client.CloseableHttpClient;

    import org.apache.http.impl.client.HttpClients;

    import org.apache.http.util.EntityUtils;

 

    /**

    * 代码展示了如果使用ssl context创建安全socket连接

    */

    public class ClientCustomSSL {

        public final static void main(String[] args) throws Exception {

            KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());

            //加载证书文件

            FileInputStream instream = new FileInputStream(new File("/home/victor/my.store"));

            try {

                trustStore.load(instream, "mypassword".toCharArray());

            } finally {

                instream.close();

            }

            SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore).build();

            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,

                    SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);

            CloseableHttpClient httpclient = HttpClients.custom()

                    .setSSLSocketFactory(sslsf)

                    .build();

            try

            {

                //访问支付宝

                HttpGet httpget = new HttpGet("https://www.alipay.com/");

                System.out.println("executing request" + httpget.getRequestLine());

                CloseableHttpResponse response = httpclient.execute(httpget);

                try {

                    HttpEntity entity = response.getEntity();

                    System.out.println("----------------------------------------");

                    System.out.println(response.getStatusLine());

                    if (entity != null) {

                        System.out.println(EntityUtils.toString(entity));

                    }

                } finally {

                    response.close();

                }

            } finally {

                httpclient.close();

            }

        }

    }

CloseableHttpClient没设置超时时间引发的血案

CloseableHttpClient没设置超时时间引发的血案

项目背景

一个Java语言写的任务系统,使用固定线程大小的线程池处理长时间任务,任务具体业务逻辑为周期性调用一个外部http接口。调用外部接口使用的是CloseableHttpClient

问题现象

某一天任务调用的外部http接口切换到新域名下,连续好几天发现线程池有偶现的任务线程不打印业务日志了(就像任务线程好像异常退出了一样),但是查询数据库,对应的任务状态并没有结束。线程池提交任务执行代码如下:

Future future = executorService.submit(() -> {
    try {
        //执行任务
    } catch (InterruptedException e) {
        //更新任务状态1
    } catch (Exception e) {
        //更新任务状态2
    } finally {
        //提交数据库
    }
});

原因分析

1、如果是任务执行代码有异常,应该会走到finally更新数据库任务记录状态。数据库任务记录没有更新,说明线程任务还在执行(确定finally中的提交数据库代码没有异常)。

2、既然线程还在执行,对应任务却没有输出业务日志,就需要思考是不是线程阻塞了。

3、通过jstack -l ${pid} 查询jvm线程信息,并没有发现有线程存在共用对象互锁的情况。根据任务代码定位到某个异常任务对应的线程,发现状态是RUNNABLE,但是堆栈调用显示在这个方法上

"pool-2-thread-209" #476 prio=5 os_prio=0 cpu=5035.61ms elapsed=356247.91s tid=0x00007fcb90031000 nid=0x129c runnable  [0x00007fcb199de000]
   java.lang.Thread.State: RUNNABLE
	at java.net.socketInputStream.socketRead0(java.base@11.0.2/Native Method)
	at java.net.socketInputStream.socketRead(java.base@11.0.2/SocketInputStream.java:115)
	at java.net.socketInputStream.read(java.base@11.0.2/SocketInputStream.java:168)
	at java.net.socketInputStream.read(java.base@11.0.2/SocketInputStream.java:140)
	at sun.security.ssl.SSLSocketInputRecord.read(java.base@11.0.2/SSLSocketInputRecord.java:448)
	at sun.security.ssl.SSLSocketInputRecord.decodeInputRecord(java.base@11.0.2/SSLSocketInputRecord.java:237)
	at sun.security.ssl.SSLSocketInputRecord.decode(java.base@11.0.2/SSLSocketInputRecord.java:190)
	at sun.security.ssl.SSLTransport.decode(java.base@11.0.2/SSLTransport.java:108)
	at sun.security.ssl.SSLSocketImpl.decode(java.base@11.0.2/SSLSocketImpl.java:1152)
	at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(java.base@11.0.2/SSLSocketImpl.java:1063)
	at sun.security.ssl.SSLSocketImpl.startHandshake(java.base@11.0.2/SSLSocketImpl.java:402)
	- locked <0x000000070a6b62d8> (a sun.security.ssl.TransportContext)
	at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createlayeredSocket(SSLConnectionSocketFactory.java:436)
	at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:384)
	at org.apache.http.impl.conn.DefaultHttpClientConnectionoperator.connect(DefaultHttpClientConnectionoperator.java:142)
	at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376)
	at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
	at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
	at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
	at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
	at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
	at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)

推测这个方法at java.net.socketInputStream.socketRead0(java.base@11.0.2/Native Method) 一致阻塞?

4、查询stackoverflow,发现有网友提到openjdk 8的版本,概率性存在socketRead0一直阻塞的情况,但是后续版本修复了这个问题。当前线上环境用的是openjdk 11,所以排除这个可能。

5、那为什么socketRead0会一直阻塞呢,是不是没有设置超时时间?阅读JDK文档,发现如果没设置socket超时时间(默认为0),socketRead0会一直阻塞,直到读到数据。

6、当前项目工程调用第三方http接口,使用的CloseableHttpClient发现没有设置超时时间

setSocketTimeout、setConnectTimeout,而这个时间会在底层socket连接和读socket缓冲区内容时会用到,默认为0,表示一直阻塞直到读取到内容。

先这样处理,紧急上线,看看后续效果

总结

以上是小编为你收集整理的CloseableHttpClient没设置超时时间引发的血案全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

原文地址:https://blog.csdn.net/m0_38028154/article/details/122670856

关于如何-Spring IoC和HttpClient 4.3.1 CloseableHttpClient?spring http客户端的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android HttpClient,DefaultHttpClient,HttpPost、CloseableHttpClient 调用 Post 的时候 StringEntity 字符集、CloseableHttpClient加载证书来访问https网站、CloseableHttpClient没设置超时时间引发的血案的相关知识,请在本站寻找。

针对PoolingHttpClientConnectionManager:如何执行Https请求?https执行过程这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Android HttpClient 上传文件与 Httpconnection 知识小结、Android 中使用 HttpURLConnection 和 HttpClient 发送 Http 请求、Android 网络提交数据 (HttpConnection HttpClient) POST GET 方式、Android两种HTTP通信,HttpURLConnection和HttpClient等相关知识,希望可以帮助到你。

本文目录一览:

PoolingHttpClientConnectionManager:如何执行Https请求?(https执行过程)

PoolingHttpClientConnectionManager:如何执行Https请求?(https执行过程)

我目前正在尝试使用进行多个HttpGet请求CloseableHttpClient
我用谷歌搜索了如何做到这一点,答案是使用PoolingHttpClientConnectionManager

至此,我得到了:

PoolingHttpClientConnectionManager cManager = new PoolingHttpClientConnectionManager();CloseableHttpClient httpClient = HttpClients.custom()    .setConnectionManager(cManager)    .build();

然后我尝试了一个HttpGet请求,http://www.google.com并且一切正常。

然后,我通过cmd创建了一个信任库,并导入了目标网站的证书,SSLConnectionSocketFactory使用我的信任库设置并设置的SSLSocketFactoryof
httpClient

KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());FileInputStream inputStream = new FileInputStream(new File("myTrustStore.truststore"));trustStore.load(inputStream, "nopassword".toCharArray());inputStream.close();SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(trustStore).build();SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,    SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);PoolingHttpClientConnectionManager cManager = new PoolingHttpClientConnectionManager();CloseableHttpClient httpClient = HttpClients.custom()    .setSSLSocketFactory(sslsf)    .setConnectionManager(cManager)    .build();

如果我尝试执行Https,HttpGet则会出现PKIX path building failed异常。
如果我做同样的事情,但.setConnectionManager(cManager)一切正常。

谁能告诉我如何使它起作用?(不用担心,我不会创建任何ddos工具)

提前致谢!

PS:我正在使用HttpComponents 4.3.1

答案1

小编典典

找到了答案:http://codingdict.com/questions/136416

只需添加

Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sslsf).build();

socketFactoryRegistry作为参数传递给的构造函数PoolingHttpClientConnectionManager。现在可以正常工作了:)

Android HttpClient 上传文件与 Httpconnection 知识小结

Android HttpClient 上传文件与 Httpconnection 知识小结

 Android 上传文件到服务端可以使用 HttpConnection 上传文件,也可以使用 Android 封装好的 HttpClient 类。当仅仅上传文件可以直接使用 httpconnection 上传比较方便快捷。

 

        1、使用 HttpConection 上传文件。将文件转换成表单数据流。主要的思路就自己构造个 http 协议内容,服务端解析报文获得表单数据。代码片段:

 

[java] view plaincopy

HttpURLConnection con;  

    try {  

        con = (HttpURLConnection) url.openConnection();  

        con.setConnectTimeout(C_TimeOut);  

        /* 允许 Input、Output,不使用 Cache */  

        con.setDoInput(true);  

        con.setDoOutput(true);  

        con.setUseCaches(false);  

        /* 设置传送的 method=POST */  

        con.setRequestMethod("POST");  

        /* setRequestProperty */  

        con.setRequestProperty("Connection", "Keep-Alive");  

        con.setRequestProperty("Charset", "UTF-8");  

        con.setRequestProperty("Content-Type","multipart/form-data;boundary=" + boundary);  

      

        /* 设置 DataOutputStream */  

         DataOutputStream ds = new DataOutputStream(con.getOutputStream());  

         FileInputStream fStream = new FileInputStream(file);  

  

          /* 设置每次写入 1024bytes */  

          int bufferSize = 1024;  

          byte[] buffer = new byte[bufferSize];  

  

          int length = -1;  

          /* 从文件读取数据至缓冲区 */  

          while((length = fStream.read(buffer)) != -1)  

          {  

            /* 将资料写入 DataOutputStream 中 */  

            ds.write(buffer, 0, length);  

          }   

          fStream.close();   

          ds.flush();  

          ds.close();  

           

 

可以参考

 

        ①《在 Android 上通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传》     (http://bertlee.iteye.com/blog/1134576)。

 

        ②《关于 android Http 访问,上传,用了三个方法 》

 

2、使用 Android HttpClient 类上传参数。下面我在网上搜到得代码,忘记出处了

 

   

 

[java] view plaincopy

private static boolean sendPOSTRequestHttpClient(String path,  

        Map<String, String> params) throws Exception {  

    // 封装请求参数  

    List<NameValuePair> pair = new ArrayList<NameValuePair>();  

    if (params != null && !params.isEmpty()) {  

        for (Map.Entry<String, String> entry : params.entrySet()) {  

            pair.add(new BasicNameValuePair(entry.getKey(), entry  

                    .getValue()));  

        }  

    }   

    // 把请求参数变成请求体部分  

    UrlEncodedFormEntity uee = new UrlEncodedFormEntity(pair, "utf-8");   

    // 使用 HttpPost 对象设置发送的 URL 路径  

    HttpPost post = new HttpPost(path);   

    // 发送请求体  

    post.setEntity(uee);   

    // 创建一个浏览器对象,以把 POST 对象向服务器发送,并返回响应消息  

    DefaultHttpClient dhc = new DefaultHttpClient();  

    HttpResponse response = dhc.execute(post);  

    if (response.getStatusLine().getStatusCode() == 200) {  

        Log.i("http", "httpclient");  

        return true;  

    }  

    return false;  

}  

 

3、使用 httpClient 上传文字信息和文件信息。使用 httpClient 上传文件非常的方便。不过需要导入 apache-mime4j-0.6.jar 和 httpmime-4.0.jar 两个.jar 包。

 

[java] view plaincopy

// 封装请求参数  

        MultipartEntity mpEntity = new MultipartEntity();  

        if (params != null && !params.isEmpty()) {  

            for (Map.Entry<String, String> entry : params.entrySet()) {  

  

                StringBody par = new StringBody(entry.getValue());  

                mpEntity.addPart(entry.getKey(), par);  

            }  

        }  

        // 图片  

        if (!imagepath.equals("")) {  

            FileBody file = new FileBody(new File(imagepath));  

            mpEntity.addPart("photo", file);  

        }  

        // 使用 HttpPost 对象设置发送的 URL 路径  

        HttpPost post = new HttpPost(path);  

        // 发送请求体  

        post.setEntity(mpEntity);  

        // 创建一个浏览器对象,以把 POST 对象向服务器发送,并返回响应消息  

        DefaultHttpClient dhc = new DefaultHttpClient();  

        HttpResponse response = dhc.execute(post);  

 

 

FileBody 类可以把文件封装到表单中,实现附件的上传。  

 

关于 httpClient 上传文件可以参考链接: http://www.eoeandroid.com/forum.php?mod=viewthread&tid=76721&page=1

 

需要用的的 ja 下载地址 r:http://download.csdn.net/detail/china1988s/3791514

Android 中使用 HttpURLConnection 和 HttpClient 发送 Http 请求

Android 中使用 HttpURLConnection 和 HttpClient 发送 Http 请求

    在 android 应用程序中,可以使用 HttpURLConnection 发送 HTTP 请求。详见如下实例

1、activity_main.xml 布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:orientation="vertical"
    >
	<Button 
	    android:id="@+id/send_request"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:text="发送请求"
	    />
	<ScrollView 
	    android:layout_width="match_parent"
	    android:layout_height="match_parent"
	    >
	    <TextView 
	        android:id="@+id/content"
	        android:layout_width="match_parent"
	        android:layout_height="wrap_content"
	        />
	    
	</ScrollView>
</LinearLayout>
2、MainActivity.java

package com.example.testhttp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener{
	
	private Button sendRequest;
	private TextView content;
	
	private static final int SHOW_RESPONSE_CONTENT = 0;
	
	private Handler handler = new Handler(){
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case SHOW_RESPONSE_CONTENT:
				String response = (String) msg.obj;
				//显示到界面上
				content.setText(response);
				break;
			default:
				break;
			}
			
		};
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//获取发送按钮
		sendRequest = (Button) findViewById(R.id.send_request);
		//获取TextView
		content = (TextView) findViewById(R.id.content);
		sendRequest.setOnClickListener(this);
	}
	
	//重写点击方法
	@Override
	public void onClick(View view) {
		if(view.getId() == R.id.send_request){
			//如果是点击发送按钮,则处理Http请求--使用HttpURLConnection
			sendRequestWithHttpURLConnection();
		}
	}
	
	/**
	 * 使用HttpURLConnection发送请求
	 */
	public void sendRequestWithHttpURLConnection(){
		//新起一线程
		new Thread(new Runnable() {
			//处理逻辑
			@Override
			public void run() {
				HttpURLConnection connection = null;
				try {
					URL url = new URL("http://www.baidu.com");
					connection = (HttpURLConnection) url.openConnection();
					//设置参数
					//发送请求
					connection.setRequestMethod("GET");
					//连接超时时间
					connection.setConnectTimeout(5000);
					InputStream in = connection.getInputStream();
					//对服务器返回的输入流进行读取
					BufferedReader reader = new BufferedReader(new InputStreamReader(in));
					StringBuilder builder = new StringBuilder();
					String line;
					while((line = reader.readLine())!=null){
						builder.append(line);
					}
					
					//使用Message
					Message message = new Message();
					message.what = SHOW_RESPONSE_CONTENT;
					message.obj = builder.toString();
					handler.sendMessage(message);
				} catch (MalformedURLException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}finally{
					if(connection!=null){
						//断开连接
						connection.disconnect();
					}
				}
				
			}
		}).start();
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}



}
3、获取网络访问权限

修改 AndroidManifest.xml,添加:

<uses-permission android:name="android.permission.INTERNET"/>
4、结果

点击发送按钮,如下所示:

      

这就是服务器返回给我吗的 Html 代码。


如果是发送数据给服务器呢?看如下代码:

connection.setRequestMethod("POST");
					DataOutputStream out = new DataOutputStream(connection.getOutputStream());
					out.writeBytes("username=yy&password=admin");


此外,可以使用 HttpClient 发送 Http 请求,

其他不变,在 MainActivity.java 类中添加方法 sendRequestWithHttpClient,如下:

private void sendRequestWithHttpClient(){
		new Thread(new Runnable() {
			@Override
			public void run() {
			
				try {
					HttpClient httpClient= new DefaultHttpClient();
					HttpGet httpGet = new HttpGet("http://www.baidu.com");
					HttpResponse httpResponse = httpClient.execute(httpGet);
					if(httpResponse.getStatusLine().getStatusCode() == 200){
						//请求和相应成功
						HttpEntity entity = httpResponse.getEntity();
						//防止中文乱码
						String responseText = EntityUtils.toString(entity,"utf-8");
						Message message = new Message();
						message.what = SHOW_RESPONSE_CONTENT;
						message.obj = responseText.toString();
						handler.sendMessage(message);
					}
				} catch (ClientProtocolException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}).start();
	}
修改 onClick 方法,如下:
//重写点击方法
	@Override
	public void onClick(View view) {
		if(view.getId() == R.id.send_request){
			//如果是点击发送按钮,则处理Http请求--使用HttpURLConnection
		//	sendRequestWithHttpURLConnection();
			//如果是点击发送按钮,则处理Http请求--使用HttpClient
			sendRequestWithHttpClient();
		}
	}



效果如下:

     

Android 网络提交数据 (HttpConnection HttpClient) POST GET 方式

Android 网络提交数据 (HttpConnection HttpClient) POST GET 方式

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	android:id="@+id/widget38"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	android:orientation="vertical"
	xmlns:android="http://schemas.android.com/apk/res/android">
<EditText
	android:id="@+id/et_username"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:hint="&#35831;&#36755;&#20837;&#29992;&#25143;&#21517;"
	android:textSize="18sp" />
<EditText
	android:id="@+id/et_password"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:hint="&#35831;&#36755;&#20837;&#23494;&#30721;"
	android:textSize="18sp" />
<Button
	android:id="@+id/btn_get"
	android:onClick="click"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:layout_weight="1000"
	android:text="GET提交" />
<Button
	android:id="@+id/btn_post"
	android:onClick="click"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:layout_weight="1000"
	android:text="POST提交" />
<Button
	android:id="@+id/btn_get_httpclient"
	android:onClick="click"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:layout_weight="1000"
	android:text="HttpClient Get提交" />
<Button
	android:id="@+id/btn_post_httpclient"
	android:onClick="click"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:layout_weight="1000"
	android:text="HttpClient POST提交" />
</LinearLayout>

 

package com.pas.postdata;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import com.pas.htmlview.utils.StreamTools;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Context;
import android.text.TextUtils;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity
{

	private EditText et_username;
	private EditText et_password;

	private final int SHOWINFO = 0;
	private final int CHANGEUI = 1;

	private Handler handler = new Handler()
	{
		@Override
		public void handleMessage(android.os.Message msg)
		{
			switch (msg.what)
			{
			case SHOWINFO:
				ShowInfo(MainActivity.this, msg.obj.toString());
				break;
			case CHANGEUI:
				break;
			default:
				break;
			}
		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		et_username = (EditText) findViewById(R.id.et_username);
		et_password = (EditText) findViewById(R.id.et_password);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	public void click(final View view)
	{
		final String username = et_username.getText().toString().trim();
		final String password = et_password.getText().toString().trim();

		if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password))
		{
			Toast.makeText(this, "信息不可为空", Toast.LENGTH_LONG).show();
		} else
		{

			new Thread()
			{
				@Override
				public void run()
				{
					try
					{
						InputStream is = null;
						// GET方式
						if (view.getId() == R.id.btn_get)
						{
							is = getByHttpConnection(username, password);
						} else if (view.getId() == R.id.btn_post)
						{
							is = postByHttpConnection(username, password);
						} else if (view.getId() == R.id.btn_get_httpclient)
						{
							// HttpClient 方式
							is = getByHttpClient(username, password);
						} else if (view.getId() == R.id.btn_post_httpclient)
						{
							is = postByHttpClient(username, password);
						}

						final String res = StreamTools.StreamToString(is);
						if (res != null)
						{
							// 不使用handler的另一种方式
							// 这种方式也可以封装
							runOnUiThread(new Runnable()
							{

								@Override
								public void run()
								{
									ShowInfo(MainActivity.this, res);
								}
							});
						} else
						{
							handler.sendMessage(getMsg(SHOWINFO, "失败"));
						}
					} catch (Exception e)
					{
						e.printStackTrace();
						handler.sendMessage(getMsg(SHOWINFO, "获取失败"));
					}
				}
			}.start();
		}
	}

	private InputStream postByHttpConnection(final String username, final String password) throws MalformedURLException, IOException, ProtocolException
	{
		HttpURLConnection conn;
		// POST方式
		String path = "http://192.168.1.100:8080/ServletTest/Login";
		URL post_url = new URL(path);
		conn = (HttpURLConnection) post_url.openConnection();
		conn.setRequestMethod("POST");

		// 准备数据
		String data = "username=" + username + "&password=" + password;
		byte[] data_bytes = data.getBytes();

		conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
		conn.setRequestProperty("Content-Length", data_bytes.length + "");
		// POST方式:浏览器将数据以流的方式写入服务器
		conn.setDoOutput(true);// 允许向外部写入数据
		OutputStream os = conn.getOutputStream();
		os.write(data_bytes);
		conn.setConnectTimeout(5000);

		if (200 == conn.getResponseCode())
		{
			return conn.getInputStream();
		}
		return null;
	}

	private InputStream getByHttpConnection(final String username, final String password) throws UnsupportedEncodingException, MalformedURLException, IOException, ProtocolException
	{
		HttpURLConnection conn;
		String path = "http://192.168.1.100:8080/ServletTest/Login" + "?username=" + URLEncoder.encode(username, "utf-8") + "&password=" + URLEncoder.encode(password, "utf-8");
		URL get_url = new URL(path);
		conn = (HttpURLConnection) get_url.openConnection();
		conn.setRequestMethod("GET");
		conn.setConnectTimeout(5000);
		return conn.getInputStream();
	}

	private InputStream getByHttpClient(final String username, final String password) throws Exception
	{
		String path = "http://192.168.1.100:8080/ServletTest/Login" + "?username=" + URLEncoder.encode(username, "utf-8") + "&password=" + URLEncoder.encode(password, "utf-8");
		HttpClient client = new DefaultHttpClient();

		HttpGet httpGet = new HttpGet(path);

		HttpResponse response = client.execute(httpGet);
		if (200 == response.getStatusLine().getStatusCode())
		{
			return response.getEntity().getContent();
		}
		return null;
	}

	private InputStream postByHttpClient(final String username, final String password) throws Exception
	{
		String path = "http://192.168.1.100:8080/ServletTest/Login";
		HttpClient client = new DefaultHttpClient();
		HttpPost httpPost = new HttpPost(path);
		
		List<NameValuePair> params = new ArrayList<NameValuePair>();
		params.add(new BasicNameValuePair("username", username));
		params.add(new BasicNameValuePair("password", password));
		httpPost.setEntity(new UrlEncodedFormEntity(params, "utf-8"));
		
		HttpResponse response = client.execute(httpPost);
		if (200 == response.getStatusLine().getStatusCode())
		{
			return response.getEntity().getContent();
		}
		return null;
	}

	public Message getMsg(int what, Object obj)
	{
		Message msg = new Message();
		msg.what = what;
		msg.obj = obj;
		return msg;
	}

	public void ShowInfo(Context context, String info)
	{
		Toast.makeText(context, info, Toast.LENGTH_SHORT).show();
	}
}

 

package com.pas.htmlview.utils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class StreamTools
{

	public static String StreamToString(InputStream is)
	{
		try
		{
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			int len = 0;
			byte[] buffer = new byte[1024];
			while ((len = is.read(buffer)) != -1)
			{
				baos.write(buffer, 0, len);
			}
			is.close();
			baos.close();
			byte[] res = baos.toByteArray();
			String tem=new String(res);
			return new String(res);
		} catch (Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}
}

 

Android两种HTTP通信,HttpURLConnection和HttpClient

Android两种HTTP通信,HttpURLConnection和HttpClient

Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。

不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。这里简单介绍下HttpURLConnection和HttpClient的使用。至于框架后面会研究后,再介绍

HttpClient的get使用

HttpClient mClient; //http客户端
public static HttpEntity getEntity(String uri,ArrayList<BasicNameValuePair> params,int method) throws    ClientProtocolException, IOException{
	mClient=new DefaultHttpClient();
	HttpUriRequest request=null;
	switch (method) {
	    case HTTP_GET://get请求
	    StringBuilder sb=new StringBuilder(uri);
		//判断设置参数为不为空
	    if(null!=params&&!params.isEmpty()){
		sb.append("?");
		//设置配置参数
		for (BasicNameValuePair param : params) {
		    sb.append(param.getName()).append("=")
			.append(URLEncoder.encode(param.getValue(), "utf-8")).append("&");
		}
		sb.deleteCharAt(sb.length()-1);    //删除多余的 &
	    }
	    HttpGet get=new HttpGet(sb.toString());    //发送get请求
	    request=get;
	    break;
	}
	//cookie缓存
	HttpClientParams.setCookiePolicy(mClient.getParams(), CookiePolicy.BROWSER_COMPATIBILITY);
	//连接时间
	mClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000);
	//设置请求超时时间
	mClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000);
	//执行请求 获得响应
	HttpResponse response = mClient.execute(request);
	if(response.getStatusLine().getStatusCode()==200){    //如果成功 返回HttpEntity 对象
	    return response.getEntity(); 
        }
        return null;
}

HttpURLConnection的post使用 post是 表单方式请求的

URL url =new URL(actionUrl);
HttpURLConnection con=(HttpURLConnection)url.openConnection();
con.setReadTimeout(10 * 1000);        //读数请求时间
con.setConnectTimeout(10 * 1000);    //连接超时
/* 允许Input、Output,不使用Cache */
con.setDoInput(true);    //以后就可以使用conn.getInputStream().read();
con.setDoOutput(true);    //以后就可以使用conn.getOutputStream().write()  get用不到这个
con.setUseCaches(false);    //不使用缓存
/* 设置传送的method=POST */
con.setRequestMethod("POST");
/* setRequestProperty */
con.setRequestProperty("Connection", "Keep-Alive");    //保持tcp连接
con.setRequestProperty("Charset", "UTF-8");            //传输字符格式 UTF-8
con.setRequestProperty("Content-Type",
"multipart/form-data;boundary="+boundary);
/* 设置DataOutputStream */
DataOutputStream ds =
new DataOutputStream(con.getOutputStream());
ds.writeBytes(twoHyphens + boundary + end);
ds.writeBytes("Content-Disposition: form-data; "+
"name=\"file1\";filename=\""+
newName +"\""+ end);
ds.writeBytes(end);  
/* 取得文件的FileInputStream */
FileInputStream fStream =new FileInputStream(uploadFile);
/* 设置每次写入1024bytes */
int bufferSize =1024;
byte[] buffer =new byte[bufferSize];
int length =-1;
/* 从文件读取数据至缓冲区 */
while((length = fStream.read(buffer)) !=-1)
{
	/* 将资料写入DataOutputStream中 */
	ds.write(buffer, 0, length);
}
ds.writeBytes(end);
ds.writeBytes(twoHyphens + boundary + twoHyphens + end);
/* close streams */
fStream.close();
ds.flush();


/* 取得Response内容 */
InputStream is = con.getInputStream();
int ch;
StringBuffer b =new StringBuffer();
while( ( ch = is.read() ) !=-1 )
{
	b.append( (char)ch );
}
/* 将Response显示于Dialog */
showDialog("上传成功"+b.toString().trim());
/* 关闭DataOutputStream */
ds.close();


关于PoolingHttpClientConnectionManager:如何执行Https请求?https执行过程的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android HttpClient 上传文件与 Httpconnection 知识小结、Android 中使用 HttpURLConnection 和 HttpClient 发送 Http 请求、Android 网络提交数据 (HttpConnection HttpClient) POST GET 方式、Android两种HTTP通信,HttpURLConnection和HttpClient的相关知识,请在本站寻找。

在这篇文章中,我们将为您详细介绍Wildfly的JAXWS实现似乎忽略了bindingProvider属性com.sun.xml.ws.transport.https.client.SSLSocketFactory的内容。此外,我们还会涉及一些关于android – google-api-java-client NetHttpTransport导致NoClassDefFoundError、android – OKHttp – 找不到setSslSocketFactory、android – 警告:忽略匿名内部类的InnerClasses属性(org.ksoap2.transport.KeepAliveHttpsTransportSE $1)、ASP.NET Core 2.1 中的 HttpClientFactory (Part 4) 整合Polly实现瞬时故障处理的知识,以帮助您更全面地了解这个主题。

本文目录一览:

Wildfly的JAXWS实现似乎忽略了bindingProvider属性com.sun.xml.ws.transport.https.client.SSLSocketFactory

Wildfly的JAXWS实现似乎忽略了bindingProvider属性com.sun.xml.ws.transport.https.client.SSLSocketFactory

我的环境是作为应用程序服务器的Maven项目和Wildfly(8.2.1)。我需要使用SOAP将传入的REST调用与第三方服务器连接。我需要SSL客户端身份验证;因此,我有自己的KeyStore和TrustStore。因此,我创建了自己的SSLContext,需要让WebService使用此SSLContext。

Wildfly出现问题,并且使用了JAXWS的实现(Apache CXF?)-我在这里描述了它(但是还有另一种方法可以解决该问题;因此,它不是重复的帖子!):
Wildfly:如何使用JAXWS-RI而不是Apache CXF(仅WebService客户端)

主要问题之一似乎是Wildfly中使用的JAXWS似乎忽略了使用property设置自己的SSLContext com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory

MyWS_Service service = new MyWS_Service(null, new QName("http://...", "MyWS"));MyWS port = service.getMyWSSOAP();BindingProvider bindingProvider = (BindingProvider) port;bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https://hostname:443/.../...");// the following setting is ignored!bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory", mySslSocketFactory);// in some posts, we see that we need to eliminate ''internal'' in the property. This does not help!bindingProvider.getRequestContext().put("com.sun.xml.ws.transport.https.client.SSLSocketFactory", mySslSocketFactory);

可以忽略的证据是,如果我HttpsURLConnection.setDefaultSSLSocketFactory(mySslSocketFactory)用来设置SSLContext,它确实可以工作-意味着SSL连接的建立要归功于导入到SSLContext中自定义的TrustStore设置的根CA。

如果我们查看其他文章(例如,如何以编程方式设置JAX-WS客户端的SSLContext?),则该属性应该有效(即使对于Wildfly,根据那里的一些评论)。但这不是我的情况。这可能是什么原因?

答案1

小编典典

问题是Apache CXF忽略了

bindingProvider.getRequestContext().put(    "com.sun.xml.[internal.]ws.transport.https.client.SSLSocketFactory", mySslSocketFactory);

在某些地方有些评论相反。

因此,我的最终解决方案是以编程方式设置HTTPConduit使用的(而不是在cxf.xml文件中设置配置)。

// Set custom SSLContext.HTTPConduit conduit = (HTTPConduit) ClientProxy.getClient(port).getConduit();TLSClientParameters tlsClientParameters = new TLSClientParameters();tlsClientParameters.setSSLSocketFactory(customSSLContext.getSocketFactory());conduit.setTlsClientParameters(tlsClientParameters);

我希望这可以帮助遇到类似问题的人…

android – google-api-java-client NetHttpTransport导致NoClassDefFoundError

android – google-api-java-client NetHttpTransport导致NoClassDefFoundError

我刚开始在 Android上学习google-api-java-client.
将下3个库添加到项目中. (我不使用Maven.)

> google-api-client-1.4.1-beta.jar
> google-api-client-googleapis-1.4.1-beta.jar
> google-api-client-googleapis-extensions-andr

并选择了可供使用的示例代码.在示例中,它使用了GoogleTransport,现在似乎无法使用.

HttpTransport transport = GoogleTransport.create();

所以我把它改成了在网上找到的NetHttpTransport().

import com.google.api.client.http.javanet.NetHttpTransport;
...
   HttpTransport transport = new NetHttpTransport();

但是,我得到了例外.

05-24 15:54:33.310: ERROR/AndroidRuntime(4586): java.lang.NoClassDefFoundError: com.google.common.base.Preconditions
05-24 15:54:33.310: ERROR/AndroidRuntime(4586):     at com.google.api.client.util.ClassInfo.<init>(ClassInfo.java:324)
05-24 15:54:33.310: ERROR/AndroidRuntime(4586):     at com.google.api.client.util.ClassInfo.of(ClassInfo.java:77)
05-24 15:54:33.310: ERROR/AndroidRuntime(4586):     at com.google.api.client.util.GenericData.<init>(GenericData.java:44)
05-24 15:54:33.310: ERROR/AndroidRuntime(4586):     at com.google.api.client.http.HttpHeaders.<init>(HttpHeaders.java:37)
05-24 15:54:33.310: ERROR/AndroidRuntime(4586):     at com.google.api.client.http.HttpTransport.<init>(HttpTransport.java:82)
05-24 15:54:33.310: ERROR/AndroidRuntime(4586):     at com.google.api.client.http.javanet.NetHttpTransport.<init>(NetHttpTransport.java:35)
05-24 15:54:33.310: ERROR/AndroidRuntime(4586):     at net.DailyTimer.test.MainActivity.onCreate(MainActivity.java:290)

这有什么问题?

解决方法

正如您在错误中看到的那样,您有一个类缺失,来自 Guava.您可以下载guava lib并将其添加到类路径中,或者使用maven(或Ivy)来管理您的依赖项.

android – OKHttp – 找不到setSslSocketFactory

android – OKHttp – 找不到setSslSocketFactory

我正在使用OkHttp 3.4.0-RC1.我正在尝试编写一个通过TLSv1.2连接Android 4.2.2 / API 17设备的Web服务.我在这篇文章Android Enable TLSv1.2 in OKHttp的底部看到了答案,但显然方法setSslSocketFactory不再存在.我也没有在OKHttp的Https文档中看到任何内容.
谢谢!

解决方法:

现在,在OkHttpClient.Builder上配置了SslSocketFactory

client = new OkHttpClient.Builder()
    .sslSocketFactory(sslSocketFactory, trustManager)
    .build();

https://github.com/square/okhttp/blob/3f7a3344a4c85aa3bbb879dabac5ee625ab987f3/samples/guide/src/main/java/okhttp3/recipes/CustomTrust.java#L54

android – 警告:忽略匿名内部类的InnerClasses属性(org.ksoap2.transport.KeepAliveHttpsTransportSE $1)

android – 警告:忽略匿名内部类的InnerClasses属性(org.ksoap2.transport.KeepAliveHttpsTransportSE $1)

当使用kso​​ap2- android-assembly-2.5.8-jar-with-dependencies.jar作为引用库(外部jar)编译 Android项目时,我收到此警告:

[2012-03-20 11:50:50 - AddressBook] Dx warning: Ignoring InnerClasses attribute for an anonymous inner class
(org.ksoap2.transport.KeepAliveHttpsTransportSE$1) that doesn''t come with an
associated EnclosingMethod attribute. This class was probably produced by a
compiler that did not target the modern .class file format. The recommended
solution is to recompile the class from source,using an up-to-date compiler
and without specifying any "-target" type options. The consequence of ignoring
this warning is that reflective operations on this class will incorrectly
indicate that it is *not* an inner class.

我正在尝试从Android客户端访问EWS SOAP服务,我的代码是:

String NAMESPACE = "http://schemas.microsoft.com/exchange/services/2006/messages";

String SOAP_ACTION = "http://schemas.microsoft.com/exchange/services/2006/messages";
String METHOD_NAME = "GetUserAvailability";
String URL = "https://vpnqrd0302.outlook.com/EWS/Exchange.asmx";

        String result = null;
        Object resultRequestSOAP = null;

        SoapObject request = new SoapObject(NAMESPACE,METHOD_NAME);

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);

        envelope.dotNet = true;
        envelope.setoutputSoapObject(request);

        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        androidHttpTransport.debug = true;


        List<HeaderProperty> headerList = new ArrayList<HeaderProperty>();
        headerList.add(new HeaderProperty("Authorization","Basic "
                + org.kobjects.base64.Base64
                .encode("temp@tempsuer.onmicrosoft.com:Password1"
                                .getBytes())));

        try {
            androidHttpTransport.call(SOAP_ACTION,envelope,headerList);

            String requestDumpString = androidHttpTransport.requestDump;
            System.out.println("requestDump : " + requestDumpString);


            resultRequestSOAP = envelope.getResponse(); // Output received

            System.out.println("resultRequestSOAP : " + resultRequestSOAP);

            result = resultRequestSOAP.toString(); // Result string

            System.out.println("OUTPUT : " + result);
        } catch (Exception e) {
            e.printstacktrace();
        }

错误是:

03-20 12:21:16.488: W/System.err(7919): SoapFault - faultcode: ''a:ErrorSchemaValidation'' faultstring: ''The request Failed schema validation: Could not find schema information for the element ''http://schemas.microsoft.com/exchange/services/2006/messages:GetUserAvailability''.'' faultactor: ''null'' detail: org.kxml2.kdom.Node@4801ce80
03-20 12:21:16.491: W/System.err(7919):     at org.ksoap2.serialization.soapSerializationEnvelope.parseBody(SoapSerializationEnvelope.java:136)
03-20 12:21:16.491: W/System.err(7919):     at org.ksoap2.soapEnvelope.parse(SoapEnvelope.java:137)
03-20 12:21:16.495: W/System.err(7919):     at org.ksoap2.transport.Transport.parseResponse(Transport.java:96)
03-20 12:21:16.495: W/System.err(7919):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:189)
03-20 12:21:16.499: W/System.err(7919):     at net.vivekiyer.gal.ActiveSyncManager.getUserAvailabilityRequest(ActiveSyncManager.java:978)
03-20 12:21:16.499: W/System.err(7919):     at net.vivekiyer.gal.CorporateAddressBook$galSearch.doInBackground(CorporateAddressBook.java:510)
03-20 12:21:16.507: W/System.err(7919):     at net.vivekiyer.gal.CorporateAddressBook$galSearch.doInBackground(CorporateAddressBook.java:1)
03-20 12:21:16.507: W/System.err(7919):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
03-20 12:21:16.507: W/System.err(7919):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
03-20 12:21:16.511: W/System.err(7919):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-20 12:21:16.511: W/System.err(7919):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
03-20 12:21:16.511: W/System.err(7919):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
03-20 12:21:16.515: W/System.err(7919):     at java.lang.Thread.run(Thread.java:1096)

解决方法

我知道这是一个老问题,但万一有人像我一样偶然发现:你提到的警告是由一个匿名的内部类引起的,而且ksoap2是用java 1.3兼容性编译的(为了兼容我认为的J2ME).除非您对这些类进行一些反思性工作(甚至在这种情况下:只有在检查类是内部类的事实时)才能安全地忽略此警告.

更好的是,这个特殊警告已经修复了ksoap2-android的2.6.4版本(见this pull request on github).

您的错误完全不相关,更可能是由于您尝试调用的Web服务使用不当造成的.

ASP.NET Core 2.1 中的 HttpClientFactory (Part 4) 整合Polly实现瞬时故障处理

ASP.NET Core 2.1 中的 HttpClientFactory (Part 4) 整合Polly实现瞬时故障处理

原文:https://www.stevejgordon.co.uk/httpclientfactory-using-polly-for-transient-fault-handling
发表于:2018年6月

      在本系列的上一篇文章中,我介绍了使用命名和类型客户端注册的DelegatingHandlers的传出中间件的概念。尽管可以使用该方法,但ASP.NET团队希望在大多数情况下,我们无需手动构建自己的处理程序。在某些情况下,库的内置功能可能会提供我们需要的功能。例如,有时将请求包装在时序代码中以跟踪它们执行所需的时间有时会很有用。现在,它已作为默认日志记录的一部分内置到IHttpClientFactory中。在其他情况下,第三方集成可能会提供您所需的功能。例如,基于横切面的思想,在HTTP请求期间处理瞬态故障。在这种情况下,与其制作自己的重试逻辑,不如使用Polly之类的库。
      Polly是一个流行的瞬态故障处理库,它提供了一种机制来定义在发生某些故障时可以应用的策略。重试策略是最常用的策略之一。您可以封装一些代码,如果发生故障,将重试这些代码,有时需要多次重试。这在您的应用程序需要与外部服务进行通信的情况下非常有用。通过HTTP之类的传输工具与服务进行通信时,始终存在瞬态故障的风险。暂时性故障可能会阻止您的请求完成,但也可能是暂时的问题。在这种情况下,使用重试是明智的选择。
      除重试外,Polly还提供了许多其他类型的策略,您可能希望将其中许多策略与重试结合使用,以建立处理故障的复杂方法。我将在本文中介绍一些常见的示例,但是如果您想更全面地介绍,我建议您查看Polly Wiki。
      ASP.NET团队与Polly的主要维护者Dylan和Joel紧密合作,加入了一种集成模式,以使将Polly策略应用于HttpClient实例变得非常简单。
      在使用Polly集成之前,我们需要为项目添加一个包引用。 IHttpClientFactory的常规功能位于Microsoft.Extensions.Http包中,该包作为依赖项包含在Microsoft.AspNetCore.App 2.1元包中。这是ASP.NET Core 2.1中新的元数据包,其中不包含第三方依赖项。因此,为了对IHttpClientFactory使用Polly扩展,我们需要将Microsoft.Extensions.Http.Polly包添加到我们的项目中。
      完成之后,csproj文件将如下所示:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.Extensions.Http.Polly" Version="2.1.0" />
  </ItemGroup>

</Project>

应用策略

      Microsoft.Extensions.Http.Polly程序包在IHttpClientBuilder上包含一个名为AddPolicyHandler的扩展方法,我们可以使用该方法添加一个处理程序,该处理程序会将使用该客户端实例的所有请求包装在Polly策略中。当我们定义一个命名或类型的客户端时,将返回IHttpClientBuilder。
      我们可以在ConfigureServices方法中使用扩展方法…

services.AddHttpClient("github")
  .AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(10)));

  在此示例中,我们定义了一个名为“ github”的客户端,并且使用了AddPolicyHandler方法来传递超时策略。您在此处提供的策略必须是IAsyncPolicy <HttpResponseMessage>。此政策将在10秒后使所有请求超时。

重用策略

      在可能的情况下,使用Polly时,最好一次性的定义策略并在应用相同策略的情况下共享它们。这样,要更改策略规则,这些更改仅需要在一个地方进行。此外,它确保仅分配策略一次。当然,如果多个调用者希望通过同一断路器实例运行,则必须共享诸如断路器之类的策略。
      在此示例中,我们将从上一个示例中声明一次超时策略,并与两个命名的客户端共享该策略。

var timeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(10));

services.AddHttpClient("github")
  .AddPolicyHandler(timeoutPolicy);

services.AddHttpClient("google")
  .AddPolicyHandler(timeoutPolicy);

  我们将在本文后面介绍另一种策略重用的选项,使用PolicyRegistry。

 瞬时故障处理

      在处理HTTP请求时,我们要处理的最常见情况是瞬时错误。由于这是一个常见的要求,因此Microsoft.Extensions.Http.Polly软件包包括一个特定的扩展名,我们可以使用该扩展名快速设置处理瞬态故障的策略。
      例如,要在命名客户端的请求发生瞬时故障时添加基本重试,我们可以按以下方式注册重试策略:

services.AddHttpClient("github")
  .AddTransientHttpErrorPolicy(p => p.RetryAsync(3));

      在这种情况下,当满足某些失败条件时,将重试通过客户端发出的所有请求。 AddTransientHttpErrorPolicy方法采用Func <PolicyBuilder <HttpResponseMessage>,IAsyncPolicy <HttpResponseMessage >>。这里的PolicyBuilder将被预先配置为处理HttpRequestExceptions,任何返回5xx状态码的响应以及任何带有408(请求超时)状态码的响应。这应该适合许多情况。如果您要求该策略在其他条件下应用,则需要使用其他重载来传递更具体的策略。
      众所周知,重试时我们需要考虑幂等性。重试HTTP GET是一个非常安全的操作。如果我们拨打了电话但未收到任何回复,则可以安全地重试该电话,而不会造成任何危险。但是,请考虑如果我们重试HTTP POST请求,可能会发生什么。我们必须格外小心,因为有可能实际上收到了您的原始请求,但是我们收到的回复提示失败。在这种情况下,重试可能导致数据重复或损坏下游系统中存储的数据。在这里,您需要更多地了解如果下游服务多次收到相同的请求,下游服务将如何处理。重试操作安全吗?当您拥有下游服务时,更容易控制它。例如,您可能使用一些唯一的标识符来防止重复的POST。
      当您无法控制游系统或知道重复的POST可能会带来负面影响时,您将需要更仔细地控制策略。更合适的选择可能是定义不同的命名/类型客户端。您可以为没有副作用与有副作用的请求分别创建一个客户端。然后,您可以使用正确的客户端来执行操作。但是,这可能会变得有点难以管理。更好的选择是使用AddPolicyHandler的重载,该重载使我们可以访问HttpRequestMessage,以便可以有条件地应用策略。该重载如下所示:
      AddPolicyHandler(Func<HttpRequestMessage, IAsyncPolicy<HttpResponseMessage>> policySelector)
      您会注意到,这里的policySelector委托可以访问HttpRequestMessage,并且应该返回IAsyncPolicy <HttpResponseMessage>。我们无法像前面的示例那样访问PolicyBuilder设置来处理瞬态故障。如果要处理常见的暂时性错误,则需要为我们的政策定义预期条件。为了使此操作更容易,Polly项目包含一个帮助程序扩展,我们可以使用它来设置一个PolicyBuilder,以处理常见的瞬时错误。要使用扩展方法,我们需要从Nuget添加Polly.Extensions.Http包。
      然后,我们可以调用HttpPolicyExtensions.HandleTranisentHttpError()来获取配置有瞬态故障条件的PolicyBuilder。我们可以使用PolicyBuilder创建合适的重试策略,然后在请求为HTTP GET时有条件地应用该策略。在此示例中,任何其他HTTP方法都使用NoOp策略。

var retryPolicy = HttpPolicyExtensions
  .HandleTransientHttpError()
  .RetryAsync(3);

var noOp = Policy.NoOpAsync().AsAsyncPolicy<HttpResponseMessage>();

services.AddHttpClient("github")
  .AddPolicyHandler(request => request.Method == HttpMethod.Get ? retryPolicy : noOp);

使用PolicyRegistry

      最后一个示例是如何通过策略注册表(policy registry)应用策略的基本演示。为了支持策略重用,Polly提供了PolicyRegistry的概念,该概念实质上是策略的容器。可以在应用程序启动时通过将策略添加到注册表中来定义。然后可以将注册表传递出去,并通过名称访问策略。

      IHttpClientBuilder的扩展方法支持使用注册表(registry)将基于Polly的处理程序添加到客户端。

var registry = services.AddPolicyRegistry();

var timeout = Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(10));
var longTimeout = Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(30));

registry.Add("regular", timeout);
registry.Add("long", longTimeout);

services.AddHttpClient("github")
	.AddPolicyHandlerFromRegistry("regular");

  首先,我们必须通过DI注册一个PolicyRegistry。 Microsoft.Extensions.Http.Polly软件包包括一些扩展方法,可简化此过程。在上面的示例中,我调用了AddPolicyRegistry方法,该方法是IServiceCollection的扩展。这将创建一个新的PolicyRegistry并通过DI注册,作为IPolicyRegistry <string>和IReadOnlyPolicyRegistry <string>的实现。该方法返回策略,以便我们可以向其添加策略。

      在此示例中,我们添加了两个超时策略并为其指定了名称。现在,在注册客户端时,我们可以调用IHttpClientBuilder上可用的AddPolicyHandlerFromRegistry方法,使用的是策略名称。当工厂创建命名客户端实例时,它会添加适当的处理程序,并调用“regular”重试策略。

总结

      作为Polly的老用户,我很高兴看到IHttpClientFactory添加了这些集成。这些库整合在一起,能够无缝处理瞬态故障,HttpClient实例非常容易启动和运行。我展示的示例非常基础和笼统,但我希望它们能为如何使用和注册策略提供一个思路。有关Polly文档和示例的更多详细信息,建议您查看Polly Wiki。在设计这种集成时,与ASP.NET和Polly团队进行的一些早期讨论非常令人高兴,因为我能够提出策略注册表扩展的有用性。

我们今天的关于Wildfly的JAXWS实现似乎忽略了bindingProvider属性com.sun.xml.ws.transport.https.client.SSLSocketFactory的分享就到这里,谢谢您的阅读,如果想了解更多关于android – google-api-java-client NetHttpTransport导致NoClassDefFoundError、android – OKHttp – 找不到setSslSocketFactory、android – 警告:忽略匿名内部类的InnerClasses属性(org.ksoap2.transport.KeepAliveHttpsTransportSE $1)、ASP.NET Core 2.1 中的 HttpClientFactory (Part 4) 整合Polly实现瞬时故障处理的相关信息,可以在本站进行搜索。

想了解“public”构造函数在抽象类中的相关性的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于构造函数 public的相关问题,此外,我们还将为您介绍关于android – 无法实例化片段,确保类名存在,是public,并且有一个空的构造函数是public、c# – 在抽象类中实现接口、c# – 抽象类中有一个构造函数是否很好?、c# – 抽象类和构造函数的新知识。

本文目录一览:

“public”构造函数在抽象类中的相关性(构造函数 public)

“public”构造函数在抽象类中的相关性(构造函数 public)

抽象类中的“public”构造函数是否相关?我想不出任何可能的方法来使用它,在这种情况下,编译器不应该将它视为错误(C#,不确定其他语言是否允许这样做)。
样本代码:

internal abstract class Vehicle{    public Vehicle()    {                }}

C编译器允许编译此代码,但我无法从外部调用此构造函数。它只能从派生类调用。所以它不应该只允许’protected’和’private’修饰符。请评论。

答案1

小编典典

没有理由为抽象类使用公共构造函数。我假设编译器没有抱怨的原因很简单,就是他们没有花时间去处理,因为它是公共的还是受保护的并不重要。

android – 无法实例化片段,确保类名存在,是public,并且有一个空的构造函数是public

android – 无法实例化片段,确保类名存在,是public,并且有一个空的构造函数是public

我正在使用片段,当我改变设备的方向时.如果最初它的肖像,当我改变为景观,那么我的应用程序崩溃.我在这里添加了logcat.我经历了很多环节,但找不到正确的答案.

请帮我解决这个问题.

谢谢

public class PageViewActivity extends FragmentActivity {

    private ViewPager viewPager;  
    private NoticePageAdapter noticePageAdapter;
    private TextView titleText;
    private int pageIndex;
    private static int restTime = 0;
    private long lastTime;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestwindowFeature(Window.FEATURE_CUSTOM_TITLE);
        setContentView(R.layout.activity_page_view);

        getwindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.window_title2);
        titleText = (TextView) findViewById(R.id.title2);
        titleText.setText(R.string.app_name);

        // Create the adapter that will return a fragment for each of the three  
        // primary sections of the app.  
        noticePageAdapter = new NoticePageAdapter(getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter.  
        viewPager = (ViewPager) findViewById(R.id.viewpager);  
        Intent intent = getIntent();
        pageIndex = intent.getIntExtra("notice_position",0);
        viewPager.setAdapter(noticePageAdapter);
        viewPager.setCurrentItem(pageIndex,true);

        lastTime = System.currentTimeMillis();

        //Check the rest time. If it exceed the 30 sec then finish the activity.
        new CheckTimeThread().start();
    }

    /** 
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to 
     * one of the sections/tabs/pages. 
     */  
    class NoticePageAdapter extends FragmentPagerAdapter {  

        public NoticePageAdapter(FragmentManager fm) {  
            super(fm);  
        }  

        @Override  
        public Fragment getItem(int position) {  
            Fragment fragment = new NoticeFragment();
            Bundle args = new Bundle();
            args.putInt(NoticeFragment.TEMPLATE_POSITION,position + 1);  
            fragment.setArguments(args);  
            return fragment;
        }  

        @Override  
        public int getCount() {  
            return NoticeData.templateId.length;  
        }  
    }  

    /** 
     * A Notice fragment representing a notices of the app,but that simply 
     * displays notices 
     */  
    public class NoticeFragment extends Fragment { 
        public static final String TEMPLATE_POSITION = "template_position";
        private TextView noticeHeaderTextView;
        private TextView noticeContentTextView;
        private ImageView noticeImageView;

        @Override  
        public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {  
            int templatePosition = getArguments().getInt(TEMPLATE_POSITION);
            int templateId = 0;
            int tempVar;

            tempVar = templatePosition - 1;
            templateId = Integer.parseInt(NoticeData.templateId[tempVar]);

            int res = R.layout.first_template;

            switch (templateId) {
            case 1:
                res = R.layout.first_template;
                break;
            case 2:
                res = R.layout.second_template;
                break;
            case 3:
                res = R.layout.third_template;
                break;
            case 4:
                res = R.layout.fourth_template;
                break;
            default:
                break;
            }

            View rootView = inflater.inflate(res,container,false);
            noticeHeaderTextView = (TextView)rootView.findViewById(R.id.noticeheading);
            noticeHeaderTextView.setText(Html.fromHtml(NoticeData.noticeheading[tempVar]));

            noticeContentTextView = (TextView)rootView.findViewById(R.id.noticeContent);
            noticeContentTextView.setText(Html.fromHtml(NoticeData.noticeContent[tempVar]));

            noticeImageView = (ImageView)rootView.findViewById(R.id.noticeImageView);
            UrlImageViewHelper.setUrlDrawable(noticeImageView,NoticeData.imagesURL[tempVar]);

            displayMetrics metrics = getResources().getdisplayMetrics();
            int width = metrics.widthPixels;

            if(templateId == 3) {
                noticeImageView.getLayoutParams().width = width / 2;
            }
            else if(templateId == 2) {
                noticeHeaderTextView.getLayoutParams().width = width/2;
                noticeContentTextView.getLayoutParams().width = width/2;
            }

            RelativeLayout relativeLayout = (RelativeLayout)rootView.findViewById(R.id.relativeLayout);
            relativeLayout.setonTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View v,MotionEvent event) {
                    resetRestTime();
                    return false;
                }
            });

            return rootView;  
        }  
    }
}

错误跟踪:

06-24 18:24:36.501: E/AndroidRuntime(11863): FATAL EXCEPTION: main
06-24 18:24:36.501: E/AndroidRuntime(11863): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.noticeboard/com.noticeboard.PageViewActivity}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.noticeboard.PageViewActivity$NoticeFragment: make sure class name exists,is public,and has an empty constructor that is public
06-24 18:24:36.501: E/AndroidRuntime(11863):    at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:1970)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at android.app.ActivityThread.handlerelaunchActivity(ActivityThread.java:3365)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at android.app.ActivityThread.access$700(ActivityThread.java:128)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1165)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at android.os.Looper.loop(Looper.java:137)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at android.app.ActivityThread.main(ActivityThread.java:4514)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at java.lang.reflect.Method.invokeNative(Native Method)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at java.lang.reflect.Method.invoke(Method.java:511)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at dalvik.system.NativeStart.main(Native Method)
06-24 18:24:36.501: E/AndroidRuntime(11863): Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.noticeboard.PageViewActivity$NoticeFragment: make sure class name exists,and has an empty constructor that is public
06-24 18:24:36.501: E/AndroidRuntime(11863):    at android.support.v4.app.Fragment.instantiate(Fragment.java:399)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at android.support.v4.app.FragmentState.instantiate(Fragment.java:97)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1760)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:200)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at com.noticeboard.PageViewActivity.onCreate(PageViewActivity.java:40)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at android.app.Activity.performCreate(Activity.java:4465)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:1934)
06-24 18:24:36.501: E/AndroidRuntime(11863):    ... 12 more
06-24 18:24:36.501: E/AndroidRuntime(11863): Caused by: java.lang.InstantiationException: can't instantiate class com.noticeboard.PageViewActivity$NoticeFragment; no empty constructor
06-24 18:24:36.501: E/AndroidRuntime(11863):    at java.lang.class.newInstanceImpl(Native Method)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at java.lang.class.newInstance(Class.java:1319)
06-24 18:24:36.501: E/AndroidRuntime(11863):    at android.support.v4.app.Fragment.instantiate(Fragment.java:388)
06-24 18:24:36.501: E/AndroidRuntime(11863):    ... 19 more

解决方法

我把内部的类静态化了.
public static class NoticeFragment extends Fragment {

它解决了我的问题.

c# – 在抽象类中实现接口

c# – 在抽象类中实现接口

是否可以在抽象类中实现接口并将实现的接口方法更改为抽象?

interface ITest
{
    string GetData();
    int ProcessData();
}

public abstract class MyAbstract:ITest
{
    public int Process()
    {
        // some code
    }

    public abstract string GetData(); // Change the implemented method into abstract Is it Possible?
}

解决方法

是的,你可以做到.只需添加abstract关键字并删除实现.这显然是一个陷阱.任何继承自抽象类的类都必须自己实现GetData.根据MyAbstract的子级数量,这可能会导致大量工作和代码重复.

在您的情况下,MyAbstract实现的接口声明了相关方法,您实际上可以完全删除GetData并依赖于ITest中此函数的声明.

c# – 抽象类中有一个构造函数是否很好?

c# – 抽象类中有一个构造函数是否很好?

在抽象类中有一个构造函数是否很好?

创建抽象类的构造函数是一个很好的编程实践吗?由于抽象类不能被初始化,所以它们的子类被初始化.

以下是我的课堂结构.

public abstract class Scheduler
{
    private Storyboard timer;

    protected Scheduler()
    {
        // initialize the timer here.
        timer = new Storyboard();

        this.PollInterval = 60;
    }
}


public class TaskScheduler : Scheduler
{
    public TaskScheduler()
        : base()
    {

    }
}

解决方法

是的,这是非常好的.只是因为构造函数只能由派生类调用并不意味着它不会有用.例如,您可能有一个抽象类,它表示某种命名实体 – 将该名称作为构造函数参数是有意义的.

这可能值得使构造函数受到保护,使得更加明显的是,您不能仅仅从别处调用它.

请注意,抽象类中有一个构造函数(或多个构造函数)会强制派生类构造函数通过它,但不会强制派生类具有相同的构造函数.例如:

public abstract class NamedFoo
{
    private readonly string name;
    public string Name { get { return name; } }

    protected NamedFoo(string name)
    {
        this.name = name;
    }
}

public class DerivedFooWithConstantName
{
    public DerivedFooWithConstantName() : base("constant name")
    {
    }
}

在这种情况下,派生类构造函数是“删除”参数(通过提供一个常量值作为抽象类构造函数的参数),但在其他情况下,它可以“添加”所需的参数或混合.

c# – 抽象类和构造函数

c# – 抽象类和构造函数

由于抽象类无法实例化,为什么构造函数仍然允许在抽象类中?

public abstract class SomeClass 
 {  
     private string _label;

     public SomeClass(string label)  
     {  
         _label=label;
     }  
}

解决方法

任何派生类的构造函数仍然必须在抽象类中调用构造函数.如果您根本没有指定任何构造函数,则所有派生类只需使用编译器提供的默认无参数类.

拥有一个构造函数是绝对有意义的 – 但在这种情况下,“public”实际上等同于“protected”.

关于“public”构造函数在抽象类中的相关性构造函数 public的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于android – 无法实例化片段,确保类名存在,是public,并且有一个空的构造函数是public、c# – 在抽象类中实现接口、c# – 抽象类中有一个构造函数是否很好?、c# – 抽象类和构造函数的相关知识,请在本站寻找。

针对如何使用Hibernate 如何使用抗原检测试剂盒这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Architecture Pattern: Publish-subscribe Pattern、eclipse下使用hibernate tools实现hibernate逆向工程、Hibernate 学习笔记(一)—— Hibernate 概述和使用 Hibernate 进行简单的增删改查操作、Hibernate 第一天(Hibernate 的环境搭建、Hibernate 的 API、Hibernate 的 CRUD)等相关知识,希望可以帮助到你。

本文目录一览:

如何使用Hibernate <subselect>:(如何使用抗原检测试剂盒)

如何使用Hibernate :(如何使用抗原检测试剂盒)

我是新来的冬眠。我需要了解以下问题:

(1)休眠映射中的子选择是什么?

(2)如何在hbm文件中映射子选择?

(3)如果我使用subselect检索值,那么如何在java Action类中获取检索的值。

答案1

小编典典
  1. 根据第5.1.3节中的描述,该subselect元素用于定义一个只读/不可变的实体,该实体基于任意本机查询的结果。
  2. 在同一来源中,人们仅subselectclass元素内使用而不是table属性,然后将查询中定义的列名称用作属性映射中的列名称。(以下摘自第5.1.3节)
<class name="Summary">  <subselect>    select item.name, max(bid.amount), count(*)    from item    join bid on bid.item_id = item.id    group by item.name  </subselect>  <synchronize table="item"/>  <synchronize table="bid"/>  <id name="name"/>  ...</class>
  1. 使用subselect元素中查询中的列创建映射后,您应该能够像访问任何其他实体一样访问属性。

Architecture Pattern: Publish-subscribe Pattern

Architecture Pattern: Publish-subscribe Pattern

Brief                            

一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式。若有纰漏请大家指正。

Role

  • Publisher:消息发布者,组装原始消息实体并触发消息传递的主体。
  • Subscriber:消息订阅者,接收消息实体并作出响应的主体。
  • Message Broker or Event Bus:消息发布者 与 消息订阅者 间的媒介,内含消息过滤和消息路由的功能,并可通过内置的消息队列(message queue)现实优先级处理。其中 过滤 功能又细分为topic-based和content-based两种类型:

    • topic-based就是为消息主题建立独立通道,订阅特定主题的订阅者将通过对应的通道接收消息;
    • content-based就是以消息内容为处理源,订阅者仅接收消息内容与目标关键词匹配的消息。

此外还可以采用hybird=topic-based和content-based的方式。

Advantages

1. Loose coupling

由于引入Message Broker来处理消息过滤和路由等功能,而Subscriber又是通过Messsage Broker来订阅消息,从而实现Publisher和Subscriber的低耦合。这种低耦合体现在两个方面。

空间:Publisher和Subscriber可运行在两个不同的进程,甚至是机器上;
时间:Publisher和Subscriber不必同时运行,通过Message Broker作为消息中转站暂存消息(Store and forward)并实现消息异步处理。

2. Scalability

由于Publisher和Subscriber在空间和时间上松耦合,那么我们就可以通过增加进程/机器的方式来提高处理能力。

Disadvantages —— Semantic Coupling         

"The most insidious kind of coupling occurs when one module makes use, >not of some syntactic element of another module, but of some semantic >knowledge of another module''s inner workings" —— chapter 5 of Code Complete

语义耦合(Semantic Coupling),是一种隐晦的耦合类型,导致代码重构、调试、修改复杂度急剧增加的主要原因。

类型如下:

  1. 操作顺序耦合:使用一个对象,需要先调用Init(),之后才能调用DoAnything()。这种顺序耦合,即使在文档中remark也是极为不优雅的做法;
  2. 全局参数传递:模块A修改了某个全局参数g_val,模块B读取该值。模块B必须知道模块A已经对该参数赋值;
  3. 业务封装不够紧密:模块A向模块B传一个参数,模块B根据该参数选择对应的操作。模块A必须知道与业务相关的所有的操作类型。对于模块A,仅传递模块A自身可以理解的语义,或者通俗的概念作为参数,而不是被封装的业务相关的参数;
  4. 超越接口的数据类型约定:模块A向模块B传递一个接口的指针,模块B将其强制转换为派生类的指针。当模块B知道该接口的实际类型时,封装已经被破坏了。非相关模块只能对接口操作,而不应对接口之外的职责进行约定。
public interface Customer{}
public class VIP : Customer{
  public void Serve(){}
}

public static void main(String[] args){
  Customer customer = new VIP();
  Serve(customer);
}
public static void Serve(Customer customer){
  VIP vip = (VIP)customer;
  vip.Serve();
}

Simple implementation

                  

/**
 * @class
 * @private
 * @description 帮助类
 */
class Utils{
        /* @method 对用户输入的filter进行加工 
         * @static
         * @package
         * @param {DOMString|Function} origFilter - 用户输出的filter
         * @returns {Function}
         * @exception
         */
        static wrapFilter(origFilter){
            var type = typeof origFilter
            if (''string'' === type) return message => RegExp(origFilter, ''i'').test(message.topic)
            else if (''function'' === type) return origFilter
            throw Error(''the type of argument(0) is wrong, which accepts string or function instance only!'')
        }
        /* @method 添加消息到消息队列
         * @static
         * @package
         * @param {Array.<Message>} mq - 消息队列
         * @param {Message} message - 被添加的消息实例
         * @param {Object.<{Number} GUIDofTimer, {Number} pause>} timer - 定时执行器
         */
        static addMessage(mq, message, timer){
                timer.pause = 1
                if (!(timer.pause = mq.length)) return mq.push(message)
                for(var i = 0, inserted = 0, m; !inserted && (m = mq[i]); ++i) 
                    if(inserted = m.priority < message.priority)
                        mq.splice(i, 0, message)
                if(!inserted) mq.push(message)
                timer.pause = 0
        }
        /* @method 分发消息给订阅者
         * @static
         * @package
         * @param {Array.<Message>} mq - 消息队列
         * @param {Array} subs - 订阅者池 
         * @returns {Array.<Message>} - 未被响应的消息回收队列
         */
        static dispatch(mq, subs){
            var message, unresponsedMq = []
            while(message = mq.shift()){
                    let found = 0
                    for(let sub of subs) if(sub.filter(message) && ++found)
                        sub.handler(message)
                    if (!found) unresponsedMq.push(message)
            }
            return unresponsedMq
        }
        static doUnsub(subs, pred){
            var sub, remainSubs = []
            while(sub = subs.shift()) if(pred());else
                remainSubs.push(sub)
            return remainSubs
        }
}

/**
 * @class
 * @private
 * @description 消息类
 */
class Message{
        constructor(topic, content, priority = 0){
                this.topic = topic
                this.content = content
                this.priority = priority
        }
}

/**
 * @class
 * @public
 * @description 消息中转站
 */
export default class MrB{
        constructor(during = 10){
            this.mq = []
            this.subs = []
            // dispatch message to subscribers, then recycle unhandled messages
            this.timer = {timer: setInterval(()=>{
                        if (this.timer.pause) return
                        this.mq = Utils.dispatch(this.mq, this.subs)
                    }, during)}
        }
        /* @method 订阅消息
         * @public
         * @param {DOMString|Function} filter - 消息过滤器
         * @param {Function} handler - 消息响应函数
         * @returns {DOMString} - 订阅编号,用于退订
         */
        sub(filter, handler){
                var guid = (+new Date()) + '''' + 100000*Math.random()
                this.subs.push({guid: guid, filter: Utils.wrapFilter(filter), handler: handler})
                return guid
        }

        /* @method 退订 
         * @public 
         * @param {DOMString|Function} filter/guid - 消息过滤器 或 订阅编号
         * @param {Function} [handler] - 消息响应函数
         */
        unsub(filter/*or guid*/, handler){
                this.subs = Utils.doUnsub(this.subs, handler 
                                ? (sub)=>sub.filter.toString() === filter.toString() && sub.handler.toString() === handler.toString()
                                : (sub)=>sub.guid === filter.toString() || sub.filter.toString() === filter.toString())
        }

        /* @method 发布消息
         * @public
         * @param {DOMString|Object|Message} topic - 消息主题 或 消息实体
         * @param {DOMString} [content=''''] - 消息内容
         * @param {Number} [priority=0] - 消息优先级
         */
        pub(topic, content = '''', priority = 0){
                var message
                if(1 === arguments.length) message = (topic.priority = topic.priority || 0, topic)
                else message = new Message(topic, content, priority)

                // push message to mq
                Utils.addMessage(this.mq, message, this.timer)
        }
}

Caution

  1. Pub/Sub模式是Messaging模式的一种,而Messaging模式是一种基于网络的架构模式(network-oriented architectural pattern),也就是说是以跨进程通信为应用范围;而Observer模式则是基于对象事件的设计模式(object-event oriented pattern),并且其应用范围是单进程内的。
  2. Pub/Sub模式适用于非实时处理;

Idea

在页面开发时我偏向于Component-Driven dev的开发模式,表面上是将页面切割为一个个功能独立的组件,本质上是将问题相关的依赖内聚,从而更好地识别、解决问题。而组件间的通信则是采用这种开发模式所必定要考虑的另一个问题。解决方案有好多,但我觉得基本原则应该是:

  1. 由于组件是相互独立的松耦合结构,它们之间的通信不应该带来耦合度上扬的副作用;(若组件间通信是紧密的,应该考虑是否开发成子组件更为合适)
  2. 组件间通信的通道应该是配置的,这样才能灵活地对数据流作加工。(如:写日志、数据转换、类型转换等)
    而采用Pub/Sub模式,利用消息作为组件间通信的数据载体,Message Broker负责信息的过滤和路由,实现消息在组件间的流转。另外可以通过定制Message Broker实现自定义组件通信通道,以AOP方式实现基础服务功能。

而这种方式不可避免地会引入新问题:
1. Message Broker作为消息中转站具有异步处理的特性,若需要同步执行,那么则需要引入另一种方式;
2. 由于组件间松耦合,必须通过良好的日志记录方式来记录消息流转路径,否则无法debug。

Thanks

https://en.wikipedia.org/wiki/Messaging_pattern
https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern
http://stackoverflow.com/questions/11857325/publisher-subscriber-vs-ob...
https://en.wikipedia.org/wiki/Store_and_forward

eclipse下使用hibernate tools实现hibernate逆向工程

eclipse下使用hibernate tools实现hibernate逆向工程

一  安装hibernate tools插件

1 在线安装

通过Eclipse的Help->Install New Software 在线安装插件,插件连接为:

  • eclipse helios(3.6)版
添加如下地址: http://download.jboss.org/jbosstools/updates/stable/helios/
选择性安装:hibernate tools在All Jboss tools节点下面
  • eclipse indigo(3.7)版
添加如下地址: http://download.jboss.org/jbosstools/updates/development/indigo/
选择性安装
  • 其它版本
自行下载: http://www.jboss.org/tools/download.html

本人原来用最新版的eclipse版本juno(4.2.2),地址为: http://download.jboss.org/jbosstools/updates/stable/juno/。

如下图:



2 成功安装了之后新建一个项目Java Project,名为 HibernateTest。

3 给项目添加数据库驱动(本人使用sqlserver2008)和Hibernate的包。如下图:

 

二 创建Hibernate配置文件(此部分为单独使用配置文件创建逆向,由于没有做成功,故可以直接跳到第三部分)

1 打开 Hibernate Configurations 视图, 菜单 Window  -> Show View -> Other...。如下图:

2 在 Hibernate Configurations 视图空白区域右建 Add Configurations ,这里名称我填写的“hibernate” ,你可以命名为其它,一会儿会被调用。如下图:

3  弹出配置窗口,各个配置项如下:

Project : Browse 选择一个需要反向工程的project ,

Database Connection: Hibernate Configured connection

Configuration File: Setup


4  填写配置文件的各种信息。填写数据连接相关内容,如IP,数据库名称,账户,密码等 点Finish,然后下个窗口点OK 完成配置。如下图:


5 点击Finish按钮完成配置文件的创建

下面采用Data Management + Hibernate配置文件的结合方式创建逆向工程。因为之前我单独使用Hibernate配置文件的方式没有逆向成功,也没有弄清楚是什么原因,后来采用两种方式结合才做成功了。

三 采用eclipse自带的数据库管理器(Data Management)联通数据库

下面全程使用图片加文字说明

1. 打开数据库管理器(Data Management),并连接上数据库


2.成功连接数据库后会看到如下图的所示


四 添加Hibernate Code Generation工具

1 点击 window - customize perspective,如下:


五 开始逆向生成Java实体类

下面也是全程使用图片加文字说明

1.创建Hibernate配置文件


2.创建完配置文件后返回的界面如下

3.切换到Common选项卡设置字符编码


4.配置文件创建完之后可以看到Hibernate Configuerations 视图的Database节点中有了数据库



5.启动Hibernate Code Generation Configuerations 工具


运行后就可以在项目的src目录下生成相应的实体类和配置文件了

Hibernate 学习笔记(一)—— Hibernate 概述和使用 Hibernate 进行简单的增删改查操作

Hibernate 学习笔记(一)—— Hibernate 概述和使用 Hibernate 进行简单的增删改查操作

Hibernate是一个开放源代码的对象关系映射框架,它将 POJO与数据库表建立映射关系,Hibernate 可以自动生成SQL语句,自动执行,完成数据持久化的任务,使得我们方便的使用对象编程思维来操纵数据库。 [TOC]

一、Hibernate 概述

Hibernate 的API一共有6个接口,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通过这些接口,可以对持久化对象进行存取、事务控制。

  1. **Session:**Session接口负责执行被持久化对象的CRUD操作。但需要注意的是Session对象是非线程安全的。
  2. **SessionFactory:**SessionFactory接口负责初始化Hibernate,并负责创建Session对象。这里用到了工厂模式。SessionFactory并不是轻量级的,所以在一般情况下,一个项目通常只需要一个SessionFactory对象。
  3. **Transaction:**Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。
  4. **Query:**Query接口可以实现对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。
  5. **Criteria:**Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。
  6. **Configuration:**Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。

二、创建第一个 Hibernate 项目

2.1、导入 Jar 包

一个简单的 Hibernate 工程共需要两类 Jar 包,一种是 Hibernate 所必须使用的 Jar 包,另外一种是数据库驱动 Jar 包。所需的 Jar 包名称如下:

  1. Hibernate 必备的 Jar 包
    1. antlr-2.7.7.jar
    2. dom4j-1.6.1.jar
    3. geronimo-jta_1.1_spec-1.1.1.jar
    4. hibernate-commons-annotations-5.0.1.Final.jar
    5. hibernate-core-5.0.7.Final.jar
    6. hibernate-jpa-2.1-api-1.0.0.Final.jar
    7. jandex-2.0.0.Final.jar
    8. javassist-3.18.1-GA.jar
    9. jboss-logging-3.3.0.Final.jar
  2. 数据库驱动 Jar 包
    1. mysql-connector-java-5.1.47.jar
    2. c3p0-0.9.2.1.jar
    3. hibernate-c3p0-5.0.7.Final.jar
    4. mchange-commons-java-0.2.3.4.jar

2.2、编写实体类

创建用户(User) 实体类,其中包含用户名、密码、昵称、出生日期等基本信息。

package com.hibernate.domain;

import java.util.Date;

public class User {
	
	private Integer uid;
	private String username;
	private String password;
	private String nickname;
	private Date birthday;
	private String realname;
	
	public Integer getUid() {
		return uid;
	}
	public void setUid(Integer uid) {
		this.uid = uid;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getRealname() {
		return realname;
	}
	public void setRealname(String realname) {
		this.realname = realname;
	}
	
	@Override
	public String toString() {
		return "User [uid=" + uid + ", username=" + username + ", password=" + password + ", nickname=" + nickname
				+ ", birthday=" + birthday + ", realname=" + realname + "]";
	}
}

2.3、编写Hibernate和实体类配置文件

2.3.1、编写 Hibernate 配置文件 —— hibernate.cfg.xml

Hibernate 的配置文件默认编写位置是在工程项目的 src 下,在配置文件中,主要配置 session-factory ,用于创建 Session 对象,以便对 POJO 进行增删改查的操作。

session-factory 中,主要配置数据库的配置信息、连接池供应商以及实体类映射文件的位置。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<!-- 配置 SessionFactory 用于创建 Session 对象 -->
	<session-factory>
		<!-- 数据库的配置信息 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">admin</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 可选配置 -->
		<property name="hibernate.show_sql">true</property>
		<!-- <property name="hibernate.format_sql">true</property> -->
		<!-- 配置 Hibernate 以何种方式生成DDL语句 update:表示检测实体类的映射配置和数据库表结构是否一致,不一致则自动更新 
			auto: -->
		<property name="hibernate.hbm2ddl.auto">update</property>
		<!-- 配置 Session 绑定本地线程 -->
		<property name="hibernate.current_session_context_class">thread</property>
		<!-- 设置连接池供应商 -->
		<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
		<!-- 配置实体类的映射文件位置 -->
		<mapping resource="com/one_to_many/domain/User.hbm.xml" />
	</session-factory>
</hibernate-configuration>

2.3.2、编写实体类配置文件 —— User.hbm.xml

实体类映射文件则是编写在与实体类相同的包下面,命名通常以 实体类名称.hbm.xml 为命名规则。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!-- package:配置实体类所在的包名称 -->
    <hibernate-mapping package="com.hibernate.domain">
    <!-- 
    	class标签,对应实体类
    		name:实体类的名称,如果配有配置package属性,需要写类的绝对路径
    		table:对应数据库中的表名称
     -->
    	<class name="User" table="tb_user">
    	<!-- 
   			id:数据库表中的主键
    		id,property
    			name:实体类的属性名称
    			column:实体类属性对应数据库表中的列名称
    	 -->
    		<id name="uid" column="user_id">
    		<!-- generator:表主键的生成策略 -->
    			<generator></generator>
    		</id>
    		<property name="username" column="username"></property>
    		<property name="password" column="password"></property>
    		<property name="nickname" column="nickname"></property>
    		<property name="birthday" column="birthday"></property>
    		<property name="realname" column="realname"></property>
    	</class>
    </hibernate-mapping>

2.3.3、编写 Hibernate 工具类,获取 Session 对象

package com.hibernate.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

	// 使用静态代码块来创建 SessionFactory 对象,保证单例
	private static SessionFactory sessionFactory;

	static {
		// 创建 Configuration 对象
		Configuration cfg = new Configuration();
		// 加载 Hibernate 默认配置文件,如果配置文件不在 src 目录下,则需要填写配置文件地址
		cfg.configure();
		// 根据配置文件,创建 SessionFactory 对象
		sessionFactory = cfg.buildSessionFactory();
	}

	public static Session openSession() {
		// 获取 session 对象
		return sessionFactory.openSession();
	}
	
	public static Session getCurrentSession() {
		// 获取与当前线程绑定的 session 对象
		return sessionFactory.getCurrentSession();
	}
}

2.3.4、测试工具类

package com.hibernate.test;


import org.hibernate.Session;
import org.junit.Test;

import com.hibernate.utils.HibernateUtil;

public class TestHibernateUtil {
	
	@Test
	public void test() {
		Session session = HibernateUtil.openSession();
	}

}

如果测试类运行成功,则在 Hibernate 配置中所连接的数据库中就会出现 tb_user 表。

三、简单的增删改查操作

3.1、保存操作

使用 Hibernate 保存数据,只需要调用 session 的 save() 方法,即可将 POJO 保存到数据库中。

package com.hibernate.test;

import java.text.ParseException;
import java.text.SimpleDateFormat;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.hibernate.domain.User;
import com.hibernate.utils.HibernateUtil;

public class TestHibernate {

	@Test
	public void testSave() {
		// 获取 session 对象
		Session session = HibernateUtil.openSession();
		// 获取 Transaction 对象
		Transaction tx = session.beginTransaction();
		// 开启事务
		tx.begin();

		try {
			User user = new User();
			user.setUsername("martin_depp@126.com");
			user.setPassword("martin0319");
			user.setNickname("奔跑的小蚂蚁");
			user.setBirthday(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("1991-03-19 11:55:00"));
			user.setRealname("孟祥杰");
			// 调用 session 对象的 save() 实现数据的持久化操作
			session.save(user);
		} catch (ParseException e) {
			e.printStackTrace();
		} finally {
			// 提交事务
			tx.commit();
			// 关闭 session
			session.close();
		}

	}
}

3.2、查找操作

使用 Hibernate 进行查找,只需要调用 session 的get(Class<T> arg0, Serializable arg1) 方法,其中 arg0 表示对应实体类名称,arg1表示主键值,如:查询主键为1的 User 实体对象。

package com.hibernate.test;

import java.text.ParseException;
import java.text.SimpleDateFormat;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.hibernate.domain.User;
import com.hibernate.utils.HibernateUtil;

public class TestHibernate {

	@Test
	public void testGet() {
		// 获取 session 对象
		Session session = HibernateUtil.openSession();
		// 获取 Transaction 对象
		Transaction tx = session.beginTransaction();

		// 开启事务
		tx.begin();

		// 此时需要注意所查询实体类主键的类型,如果是Long类型,最好为1L
		User user = session.get(User.class, 1);
        // 输出结果:
        // User [uid=1, username=martin_depp@126.com, password=martin0319, nickname=奔跑的小蚂蚁, birthday=1991-03-19 11:55:00.0, realname=孟祥杰]
		System.out.println(user);

		// 提交事务
		tx.commit();
		// 关闭 session
		session.close();
	}
}

3.3、更新操作

使用 Hibernate 更新数据,只需要调用 session 的 update() 方法,即可将 POJO 数据更新到数据库中。

package com.hibernate.test;

import java.text.ParseException;
import java.text.SimpleDateFormat;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.hibernate.domain.User;
import com.hibernate.utils.HibernateUtil;

public class TestHibernate {
    @Test
	public void testUpdate() {
		// 获取 session 对象
		Session session = HibernateUtil.openSession();
		// 获取 Transaction 对象
		Transaction tx = session.beginTransaction();
		// 开启事务
		tx.begin();
		
		User user = session.get(User.class, 1);
		user.setUsername("mengxiangjie2005@126.com");
		session.update(user);

		// 提交事务
		tx.commit();
		// 关闭 session
		session.close();
	}
}

3.4、删除操作

使用 Hibernate 保存数据,只需要调用 session 的 delete() 方法,即可将 POJO 从数据库中删除。

package com.hibernate.test;

import java.text.ParseException;
import java.text.SimpleDateFormat;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.hibernate.domain.User;
import com.hibernate.utils.HibernateUtil;

public class TestHibernate {
    
    @Test
	public void testDelete() {
		// 获取 session 对象
		Session session = HibernateUtil.openSession();
		// 获取 Transaction 对象
		Transaction tx = session.beginTransaction();
		// 开启事务
		tx.begin();
		
		User user = session.get(User.class, 1);
		session.delete(user);
		
		// 提交事务
		tx.commit();
		// 关闭 session
		session.close();
	}
	}
}

Hibernate 第一天(Hibernate 的环境搭建、Hibernate 的 API、Hibernate 的 CRUD)

Hibernate 第一天(Hibernate 的环境搭建、Hibernate 的 API、Hibernate 的 CRUD)

Hibernate 的入门(Hibernate 的环境搭建、Hibernate 的 API、Hibernate 的 CRUD)

以前学习过 Hibernate, 不过学习的不太扎实,做的项目也不太多,好久时间没用,都快忘得差不多了,今天重新学习一下,一步一个脚印的敲每个代码,争取把 Hibernate 彻底学明白。

 

 

目录

Hibernate 的入门(Hibernate 的环境搭建、Hibernate 的 API、Hibernate 的 CRUD)

 

 

1.1     Hibernate 框架的学习路线

 

1.2     Hibernate 的框架的概述

1.2.1  什么是框架

1.2.2  EE 的经典三层结构

1.3  Hibernate 的概述

1.3.1       什么是 Hibernate

1.3.2       什么是 ORM

1.3.3       为什么要学习 Hibernate

1.4     Hibernate 的入门

1.4.1  Hibernate 的入门

1.5     Hibernate 的常见配置

1.5.1  XML 提示的配置

1.5.2  Hibernate 的映射的配置

1.5.3  Hibernate 的核心的配置

1.6     Hibernate 的核心 API

1.6.1  Hibernate 的 API

源码地址:


1.1     Hibernate 框架的学习路线

     第一天:Hibernate 的入门(Hibernate 的环境搭建、Hibernate 的 API、Hibernate 的 CRUD)

     第二天:Hibernate 的一级缓存、其他的 API

     第三天:Hibernate 的一对多配置、Hibernate 的多对多的配置

     第四天:Hibernate 的查询方式、抓取策略

 

 

1.2     Hibernate 的框架的概述

1.2.1  什么是框架

框架:指的是软件的半成品,已经完成了部分功能。

1.2.2  EE 的经典三层结构

 

1.3  Hibernate 的概述

1.3.1       什么是 Hibernate

 

Hibernate:Hibernate 是一个持久层的 ORM 框架。

1.3.2       什么是 ORM

ORM:Object Relational Mapping(对象关系映射)。指的是将一个 Java 中的对象与关系型数据库中的表建立一种映射关系,从而操作对象就可以操作数据库中的表。

1.3.3       为什么要学习 Hibernate

 

1.4     Hibernate 的入门

1.4.1  Hibernate 的入门

1.4.1.1       下载 Hibernate 的开发环境

Hibernate3.x  Hibernate4.x  Hibernate5.x(我这里使用 5.0.7

 

下载地址:https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/

1.4.1.2       解压 Hibernate

     1.documentation              :Hibernate 开发的文档

     2.lib                                       :Hibernate 开发包

            2.1required                           :Hibernate 开发的必须的依赖包

            2.2optional                            :Hibernate 开发的可选的 jar

     3.project                              :Hibernate 提供的项目

1.4.1.3       创建一个项目,引入 jar 包

     1. 数据库驱动包,2.Hibernate 开发的必须的 jar 包,3.Hibernate 引入日志记录包 ,4.C3p0 连接池

 

 

1.4.1.4       创建表

CREATE TABLE `cst_customer` (

  `cust_id` bigint (32) NOT NULL AUTO_INCREMENT COMMENT '' 客户编号 (主键)'',

  `cust_name` varchar (32) NOT NULL COMMENT '' 客户名称 (公司名称)'',

  `cust_source` varchar (32) DEFAULT NULL COMMENT '' 客户信息来源 '',

  `cust_industry` varchar (32) DEFAULT NULL COMMENT '' 客户所属行业 '',

  `cust_level` varchar (32) DEFAULT NULL COMMENT '' 客户级别 '',

  `cust_phone` varchar (64) DEFAULT NULL COMMENT '' 固定电话 '',

  `cust_mobile` varchar (16) DEFAULT NULL COMMENT '' 移动电话 '',

  PRIMARY KEY (`cust_id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

1.4.1.5       创建实体类

 

1.4.1.6       创建映射(*****)

映射需要通过 XML 的配置文件来完成,这个配置文件可以任意命名。尽量统一命名规范(类名.hbm.xml

 

Customer 映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!-- 建立类与表的映射 -->
	<!--
	class标签:用来建立类和表的映射
	      *name属性:类的全路径
		  *table属性:表名(如果表名和类名一致可忽略)
		  *catalog属性:数据库名称,可忽略
    -->
	<class name="top.yangxianyang.demo1.Customer" table="cst_customer">
		<!-- 建立类中的属性与表中的主键对应 -->
		<!--
		 id标签:建立类中的属性与表中的主键对应
		    *name属性:类中的属性名
		    *column属性:表中字段名(如果类中属性名和表中字段名一致,可省略)
		    *catalog属性:数据库名称,可忽略 
			*length属性:字段长度
			*type属性:类型。写Java数据类型,Hibernate数据类型(默认),SQL类型
		-->
		<id name="cust_id" column="cust_id" >
			<!-- 主键生成策略 -->
			<generator class="native"/>
		</id>
		
		<!-- 建立类中的普通的属性和表的字段的对应 -->
		<!--
		 property标签:建立类中的普通的属性和表的字段的对应
		    *name属性:类中的属性名
		    *column属性:表中字段名(如果类中属性名和表中字段名一致,可省略)
		    *length属性:字段长度
			*type属性:类型。写Java数据类型,Hibernate数据类型(默认),SQL类型
		-->
		<property name="cust_name" column="cust_name" length="32" />
		<property name="cust_source" column="cust_source" length="32"/>
		<property name="cust_industry" column="cust_industry"/>
		<property name="cust_level" column="cust_level"/>
		<property name="cust_phone" column="cust_phone"/>
		<property name="cust_mobile" column="cust_mobile"/>
	</class>
</hibernate-mapping>

1.4.1.7       创建一个 Hibernate 的核心配置文件(*****)

Hibernate 的核心配置文件的名称:hibernate.cfg.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
		
<hibernate-configuration>
	<session-factory>
		<!-- 连接数据库的基本参数 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///sshstudy</property>
		<property name="hibernate.connection.username">yxy</property>
		<property name="hibernate.connection.password">123456</property>
		<!-- 配置Hibernate的方言:作用,根据配置的方言生成相应的SQL语句 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		
		<!-- 可选配置================ -->
		<!-- 打印SQL -->
		<property name="hibernate.show_sql">true</property>
		<!-- 格式化SQL -->
		<property name="hibernate.format_sql">true</property>
		<!-- 自动创建表 	
						none:不使用hibernate的自动建表
	                    create:如果数据库中已经有表,删除原有表,重新创建,如果没有表,新建表。(测试)
	                    create-drop	:如果数据库中已经有表,删除原有表,执行操作,删除这个表。如果没有表,新建一个,使用完了删除该表。(测试)
						update:如果数据库中有表,使用原有表,如果没有表,创建新表(更新表结构)
						validate:如果没有表,不会创建表。只会使用数据库中原有的表。(校验映射和表结构)。
		-->
		<property name="hibernate.hbm2ddl.auto">update</property>
		
		
		<!-- 配置C3P0连接池 -->
		<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
		<!--在连接池中可用的数据库连接的最少数目 -->
		<property name="c3p0.min_size">5</property>
		<!--在连接池中所有数据库连接的最大数目  -->
		<property name="c3p0.max_size">20</property>
		<!--设定数据库连接的过期时间,以秒为单位,
		如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
		<property name="c3p0.timeout">120</property>
		 <!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
		<property name="c3p0.idle_test_period">3000</property>
		
		
		
		<!-- 加载映射  -->
		<mapping resource="top/yangxianyang/demo1/Customer.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

 

1.4.1.8       编写测试代码(*****)

package top.yangxianyang.demo1;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

/**
 * Hibernate的入门案例
 * @author yxy
 *
 */
public class Test1 {
	public static void main(String[] args) {
		demo1();
	}

	// 保存客户
	public static void demo1() {
		// 1.加载Hibernate的核心配置文件
		Configuration configuration = new Configuration().configure();
		// 2.创建一个SessionFactory对象:类似于JDBC中连接池
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		// 3.通过SessionFactory获取到Session对象:类似于JDBC中Connection
		Session session = sessionFactory.openSession();
		// 4.手动开启事务:
		Transaction transaction = session.beginTransaction();
		// 5.编写代码

		Customer customer = new Customer();
		customer.setCust_name("王小红");

		session.save(customer);

		// 6.事务提交
		transaction.commit();
		// 7.资源释放
		session.close();
		sessionFactory.close();
	}
}

 

1.5     Hibernate 的常见配置

1.5.1  XML 提示的配置

1.5.1.1       配置 XML 提示问题

 

 

 

 

 

 

1.5.2  Hibernate 的映射的配置

1.5.2.1       映射的配置

  1. 【class 标签的配置】
    1. 标签用来建立类与表的映射关系
    2. 属性:
      1. name                 :类的全路径
      2. table                  :表名(类名与表名一致,table 可以省略)
      3. catalog              :数据库名
  2. 【id 标签的配置】
    1. 标签用来建立类中的属性与表中的主键的对应关系
    2. 属性:
      1. name                 :类中的属性名
      2. column              :表中的字段名(类中的属性名和表中的字段名如果一致,column 可以省略)
      3. length                :长度
      4. type                    :类型
  3. 【property 标签的配置】
    1. 标签用来建立类中的普通属性与表的字段的对应关系
    2. 属性:
      1. name                 :类中的属性名
      2. column              :表中的字段名
      3. length                :长度
      4. type                    :类型
      5. not-null              :设置非空
      6. unique               :设置唯一

1.5.3  Hibernate 的核心的配置

1.5.3.1       Hibernate 的核心配置方式(了解)

     一种方式: 属性文件的方式

     hibernate.properties

     hibernate.connection.driver_class=com.mysql.jdbc.Driver

     …

     hibernate.show_sql=true

     属性文件的方式不能引入映射文件(手动编写代码加载映射文件)

 

     二种方式:XML 文件的方式

     hibernate.cfg.xml(推荐)

1.5.3.2       核心的配置

  1. 必须的配置
    1. 连接数据库的基本的参数
      1. 驱动类
      2. url 路径
      3. 用户名
      4. 密码
    2. 方言
  2. 可选的配置
    1. 显示 SQL           :hibernate.show_sql
    2. 格式化 SQL      :hibernate.format_sql
    3. 自动建表         :hibernate.hbm2ddl.auto
      1. none                   :不使用 hibernate 的自动建表
      2. create                :如果数据库中已经有表,删除原有表,重新创建,如果没有表,新建表。(测试)
      3. create-drop      :如果数据库中已经有表,删除原有表,执行操作,删除这个表。如果没有表,新建一个,使用完了删除该表。(测试)
      4. update              :如果数据库中有表,使用原有表,如果没有表,创建新表(更新表结构)
      5. validate            :如果没有表,不会创建表。只会使用数据库中原有的表。(校验映射和表结构)。
  3. 映射文件的引入     
    1. 引入映射文件的位置

 

1.6     Hibernate 的核心 API

1.6.1  Hibernate 的 API

1.6.1.1       Configuration:Hibernate 的配置对象

 

作用:

加载核心配置文件

1.hibernate.properties

Configuration cfg = new Configuration();

2.hibernate.cfg.xml

Configuration cfg = new Configuration().configure();

 

 

 

1.6.1.2       SessionFactory:Session 工厂

 

SessionFactory 内部维护了 Hibernate 的连接池和 Hibernate 的二级缓存。是线程安全的对象。一个项目创建一个对象即可。

 

  1. 封装工具类


 

package com.itheima.hibernate.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * Hibernate的工具类
 * @author yxy
 *
 */
public class HibernateUtils {

	public static final Configuration cfg;
	public static final SessionFactory sf;
	
	static{
		cfg = new Configuration().configure();
		sf = cfg.buildSessionFactory();
	}
	/*
	 * 提供获得session的方法
	 */
	public static Session openSession(){
		return sf.openSession();
	}
}

 

 

1.6.1.3       Session:类似 Connection 对象是连接对象

 

Session 代表的是 Hibernate 与数据库的链接对象。不是线程安全的。与数据库交互桥梁。

  1. Session 中的 API
    1. 保存方法:
      1. Serializable save(Object obj);
    2. 查询方法:
      1. T get(Class c,Serializable id);
      2. T load(Class c,Serializable id);
      3. get 方法和 load 方法的区别?

 

 get 方法

         *      * 采用的是立即加载,执行到这行代码的时候,就会马上发送 SQL 语句去查询。

                    *  * 查询后返回是真实对象本身。

                    *   * 查询一个找不到的对象的时候,返回 null

 

load 方法

                   *      * 采用的是延迟加载(lazy 懒加载),执行到这行代码的时候,不会发送 SQL 语句,当真正使用这个对象的时候才会发送 SQL 语句。

                    *  * 查询后返回的是代理对象。javassist-3.18.1-GA.jar 利用 javassist 技术产生的代理。

                    *  * 查询一个找不到的对象的时候,返回 ObjectNotFoundException

        

 

  1. 修改方法
    1. void update(Object obj);

 

    1. 删除方法
      1. void delete(Object obj);

 

    1. 保存或更新
      1. void saveOrUpdate(Object obj)

 

    1. 查询所有
      1. List createSQLQuery(String sql)

 

测试代码:

package top.yangxianyang.demo1;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.itheima.hibernate.utils.HibernateUtils;

/**
 * Hibernate的工具类的测试
 * @author yxy
 *
 */
public class TestUtils {

	@Test
	// 保存客户
	public void demo1(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		Customer customer  = new Customer();
		customer.setCust_name("王小西");
		Serializable id = session.save(customer);
		System.out.println(id);
		tx.commit();
		session.close();
	}
	
	@Test
	// 查询:
	// ***** get方法和load方法的区别
	public void demo2(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		/**
		 * get方法
		 * 	* 采用的是立即加载,执行到这行代码的时候,就会马上发送SQL语句去查询。
		 *  * 查询后返回是真实对象本身。
		 * 	* 查询一个找不到的对象的时候,返回null
		 * 
		 * load方法
		 * 	* 采用的是延迟加载(lazy懒加载),执行到这行代码的时候,不会发送SQL语句,当真正使用这个对象的时候才会发送SQL语句。
		 *  * 查询后返回的是代理对象。javassist-3.18.1-GA.jar 利用javassist技术产生的代理。
		 *  * 查询一个找不到的对象的时候,返回ObjectNotFoundException
		 */
		// 使用get方法查询
		/*Customer customer = session.get(Customer.class, 1l); // 发送SQL语句
		System.out.println(customer);*/
		
		// 使用load方法查询
		Customer customer = session.load(Customer.class, 1l);
		System.out.println(customer);
		
		tx.commit();
		session.close();
	}
	
	@Test
	// 修改操作
	public void demo3(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		// 直接创建对象,进行修改
		/*Customer customer = new Customer();
		customer.setCust_id(1l);
		customer.setCust_name("王聪");
		session.update(customer);*/
		
		// 先查询,再修改(推荐)
		Customer customer = session.get(Customer.class, 1l);
		customer.setCust_name("王小贱");
		session.update(customer);
		
		tx.commit();
		session.close();
	}
	
	@Test
	// 删除操作
	public void demo4(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		// 直接创建对象,删除
	/*	Customer customer = new Customer();
		customer.setCust_id(1l);
		session.delete(customer);*/
		
		// 先查询再删除(推荐)--级联删除
		Customer customer = session.get(Customer.class, 2l);
		session.delete(customer);
		
		tx.commit();
		session.close();
	}
	
	@Test
	// 保存或更新
	public void demo5(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		/*Customer customer  = new Customer();
		customer.setCust_name("王凤");
		session.saveOrUpdate(customer);*/
		
		Customer customer = new Customer();
		customer.setCust_id(3l);
		customer.setCust_name("李如花");
		session.saveOrUpdate(customer);
		
		tx.commit();
		session.close();
	}
	
	@Test
	// 查询所有
	public void demo6(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		// 接收HQL:Hibernate Query Language 面向对象的查询语言
		/*Query query = session.createQuery("from Customer");
		List<Customer> list = query.list();
		for (Customer customer : list) {
			System.out.println(customer);
		}*/
		
		// 接收SQL:
		SQLQuery query = session.createSQLQuery("select * from cst_customer");
		List<Object[]> list = query.list();
		for (Object[] objects : list) {
			System.out.println(Arrays.toString(objects));
		}
		tx.commit();
		session.close();
	}
}

 

 

1.6.1.4       Transaction:事务对象

Hibernate 中管理事务的对象。

     commit();

     rollback();

 

源码地址:

链接:https://pan.baidu.com/s/1cYbNGrbGu3NPOiIPTpzqOw 密码:y8kj

在图书馆看了几个小时终于整完了,基本框架搭建,环境配置成功,配置了 C3P0 连接池,封装了工具类,明天继续。

本文同步分享在 博客 “Albert Yang”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。

我们今天的关于如何使用Hibernate 如何使用抗原检测试剂盒的分享已经告一段落,感谢您的关注,如果您想了解更多关于Architecture Pattern: Publish-subscribe Pattern、eclipse下使用hibernate tools实现hibernate逆向工程、Hibernate 学习笔记(一)—— Hibernate 概述和使用 Hibernate 进行简单的增删改查操作、Hibernate 第一天(Hibernate 的环境搭建、Hibernate 的 API、Hibernate 的 CRUD)的相关信息,请在本站查询。

本文将为您提供关于用Java的Bouncy Castle自签名的X509证书的详细介绍,我们还将为您解释java签名验签的相关知识,同时,我们还将为您提供关于c# – 如何使用BouncyCastle生成根证书,然后使用由该根证书签名的站点证书?、java – 使用带有证书路径(cert chain)的bouncycastle创建x.509证书、Java的x509证书解析库、org.bouncycastle.asn1.x500.X500NameStyle的实例源码的实用信息。

本文目录一览:

用Java的Bouncy Castle自签名的X509证书(java签名验签)

用Java的Bouncy Castle自签名的X509证书(java签名验签)

我需要使用Java的Bouncy Castle创建一个自签名的X509证书,但是我尝试包含的每个类均已弃用。我该如何解决?还有其他课程吗?谢谢

答案1

小编典典

使用BouncyCastle的最新版本- 1.55 1.66
通过@Bewusstsein更新答案。截至此答案(5/11/2017),最新版本不推荐使用bouncycastle类。如果您使用的是1.55或更高版本:

public static Certificate selfSign(KeyPair keyPair, String subjectDN) throws OperatorCreationException, CertificateException, IOException{    Provider bcProvider = new BouncyCastleProvider();    Security.addProvider(bcProvider);    long now = System.currentTimeMillis();    Date startDate = new Date(now);    X500Name dnName = new X500Name(subjectDN);    BigInteger certSerialNumber = new BigInteger(Long.toString(now)); // <-- Using the current timestamp as the certificate serial number    Calendar calendar = Calendar.getInstance();    calendar.setTime(startDate);    calendar.add(Calendar.YEAR, 1); // <-- 1 Yr validity    Date endDate = calendar.getTime();    String signatureAlgorithm = "SHA256WithRSA"; // <-- Use appropriate signature algorithm based on your keyPair algorithm.    ContentSigner contentSigner = new JcaContentSignerBuilder(signatureAlgorithm).build(keyPair.getPrivate());    JcaX509v3CertificateBuilder certBuilder = new JcaX509v3CertificateBuilder(dnName, certSerialNumber, startDate, endDate, dnName, keyPair.getPublic());    // Extensions --------------------------    // Basic Constraints    BasicConstraints basicConstraints = new BasicConstraints(true); // <-- true for CA, false for EndEntity    certBuilder.addExtension(new ASN1ObjectIdentifier("2.5.29.19"), true, basicConstraints); // Basic Constraints is usually marked as critical.    // -------------------------------------    return new JcaX509CertificateConverter().setProvider(bcProvider).getCertificate(certBuilder.build(contentSigner));}

c# – 如何使用BouncyCastle生成根证书,然后使用由该根证书签名的站点证书?

c# – 如何使用BouncyCastle生成根证书,然后使用由该根证书签名的站点证书?

我正在尝试构建一个使用带有SSL的WebAPI的自托管服务,我需要能够自行生成要使用的SSL证书.我希望能够从C#中做到这一切.我一直在玩BouncyCastle.

我需要生成2个证书,一个根和一个站点证书.然后我需要在Windows中将它们安装在正确的位置.

我无法弄清楚如何使我的第二个证书参考我的根ca.我试过的所有东西都让我得到了一个不受信任的证书错误.任何帮助,将不胜感激.

解决方法

这就是我所做的(我正在使用DSA,但如果您使用RSA,只需更改密钥生成).
public void IssueClientFromCA()
{
    // get CA
    string caCn = "MyCA CommonName";
    Stream caCertFile = File.OpenRead(string.Format(@"{0}\{1}",_certificatesDir,"MyCAFile.pfx"));
    char[] caPass = "passwordForThePfx".tochararray();

    Pkcs12Store store = new Pkcs12StoreBuilder().Build();
    store.Load(caCertFile,caPass);            
    var caCert = store.GetCertificate(caCn).Certificate;
    var caPrivKey = store.GetKey(caCn).Key;

    var clientCert = CertIssuer.GenerateDsaCertificateAsPkcs12(
        "My Client FriendlyName","My Client SubjectName","GT",new DateTime(2011,9,19),new DateTime(2014,18),"PFXPASS",caCert,caPrivKey);

    var saveAS = string.Format(@"{0}\{1}","clientCertFile.pfx");
    File.WriteallBytes(saveAS,clientCert);
}

public static byte[] GenerateDsaCertificateAsPkcs12(
    string friendlyName,string subjectName,string country,DateTime validStartDate,DateTime validEndDate,string password,Org.BouncyCastle.X509.X509Certificate caCert,asymmetricKeyParameter caPrivateKey)
{
    var keys = GenerateDsaKeys();

    #region build certificate
    var certGen = new X509V3CertificateGenerator();

    // build name attributes
    var nameOids = new ArrayList();
    nameOids.Add(Org.BouncyCastle.Asn1.X509.X509Name.CN);
    nameOids.Add(X509Name.O);
    nameOids.Add(X509Name.C);

    var nameValues = new ArrayList();
    nameValues.Add(friendlyName);
    nameValues.Add(subjectName);
    nameValues.Add(country);
    var subjectDN = new X509Name(nameOids,nameValues);

    // certificate fields
    certGen.SetSerialNumber(BigInteger.ValueOf(1));
    certGen.SetIssuerDN(caCert.SubjectDN);
    certGen.SetNotBefore(validStartDate);
    certGen.SetNotAfter(validEndDate);
    certGen.SetSubjectDN(subjectDN);
    certGen.SetPublicKey(keys.Public);
    certGen.SetSignatureAlgorithm("SHA1withDSA");

    // extended information
    certGen.AddExtension(X509Extensions.AuthorityKeyIdentifier,false,new AuthorityKeyIdentifierStructure(caCert.GetPublicKey()));
    certGen.AddExtension(X509Extensions.SubjectKeyIdentifier,new SubjectKeyIdentifierStructure(keys.Public));
    #endregion

    // generate x509 certificate
    var cert = certGen.Generate(caPrivateKey);
    //ert.Verify(caCert.GetPublicKey());

    var chain = new Dictionary<string,Org.BouncyCastle.X509.X509Certificate>();
    //chain.Add("CertiFirmas CA",caCert);
    var caCn = caCert.SubjectDN.GetValues(X509Name.CN)[0].ToString();
    chain.Add(caCn,caCert);

    // store the file
    return GeneratePkcs12(keys,cert,friendlyName,password,chain);
}

private static byte[] GeneratePkcs12(asymmetricCipherKeyPair keys,Org.BouncyCastle.X509.X509Certificate cert,string friendlyName,Dictionary<string,Org.BouncyCastle.X509.X509Certificate> chain)
{
    var chainCerts = new List<X509CertificateEntry>();

    // Create the PKCS12 store
    Pkcs12Store store = new Pkcs12StoreBuilder().Build();

    // Add a Certificate entry
    X509CertificateEntry certEntry = new X509CertificateEntry(cert);
    store.SetCertificateEntry(friendlyName,certEntry); // use DN as the Alias.
    //chainCerts.Add(certEntry);

    // Add chain entries
    var additionalCertsAsBytes = new List<byte[]>();
    if (chain != null && chain.Count > 0)
    {
        foreach (var additionalCert in chain)
        {
            additionalCertsAsBytes.Add(additionalCert.Value.GetEncoded());
        }
    }

    if (chain != null && chain.Count > 0)
    {
        var addicionalCertsAsX09Chain = BuildCertificateChainBC(cert.GetEncoded(),additionalCertsAsBytes);

        foreach (var addCertAsX09 in addicionalCertsAsX09Chain)
        {
            chainCerts.Add(new X509CertificateEntry(addCertAsX09));
        }
    }

    // Add a key entry
    asymmetricKeyEntry keyEntry = new asymmetricKeyEntry(keys.Private);

    // no chain
    store.SetKeyEntry(friendlyName,keyEntry,new X509CertificateEntry[] { certEntry });

    using (var memoryStream = new MemoryStream())
    {
        store.Save(memoryStream,password.tochararray(),new SecureRandom());
        return memoryStream.ToArray();
    }
}

一些缺失的方法:

static IEnumerable<Org.BouncyCastle.X509.X509Certificate> BuildCertificateChainBC(byte[] primary,IEnumerable<byte[]> additional)
{
    X509CertificateParser parser = new X509CertificateParser();
    PkixCertPathBuilder builder = new PkixCertPathBuilder();

    // Separate root from itermediate
    var intermediateCerts = new List<Org.BouncyCastle.X509.X509Certificate>();
    HashSet rootCerts = new HashSet();

    foreach (byte[] cert in additional)
    {
        var x509Cert = parser.ReadCertificate(cert);

        // Separate root and subordinate certificates
        if (x509Cert.IssuerDN.Equivalent(x509Cert.SubjectDN))
            rootCerts.Add(new TrustAnchor(x509Cert,null));
        else
            intermediateCerts.Add(x509Cert);
    }

    // Create chain for this certificate
    X509CertStoreSelector holder = new X509CertStoreSelector();
    holder.Certificate = parser.ReadCertificate(primary);

    // WITHOUT THIS LINE BUILDER CANNOT BEGIN BUILDING THE CHAIN
    intermediateCerts.Add(holder.Certificate);

    PkixBuilderParameters builderParams = new PkixBuilderParameters(rootCerts,holder);
    builderParams.IsRevocationEnabled = false;

    X509CollectionStoreParameters intermediateStoreParameters =
        new X509CollectionStoreParameters(intermediateCerts);

    builderParams.AddStore(X509StoreFactory.Create(
        "Certificate/Collection",intermediateStoreParameters));

    PkixCertPathBuilderResult result = builder.Build(builderParams);

    return result.CertPath.Certificates.Cast<Org.BouncyCastle.X509.X509Certificate>();
}

private static asymmetricCipherKeyPair GenerateDsaKeys()
{
    DSACryptoServiceProvider DSA = new DSACryptoServiceProvider();
    var dsaParams = DSA.ExportParameters(true);
    asymmetricCipherKeyPair keys = DotNetUtilities.GetDsaKeyPair(dsaParams);
    return keys;
}

另外:您必须将CA证书安装到客户端计算机中的受信任CA存储中,以及客户端证书(它可能位于Personal或ThirdParty存储中).

java – 使用带有证书路径(cert chain)的bouncycastle创建x.509证书

java – 使用带有证书路径(cert chain)的bouncycastle创建x.509证书

Hy Guys!我正在尝试使用bouncycastle创建x.509证书,该证书应该由另一个证书签名并存储为PEM base 64格式.

我已经拥有自签名证书(公钥和私钥).现在我想创建一个新的,并使用现有的自签名证书签名.

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA","BC");
keyPairGenerator.initialize(1024,new SecureRandom());
KeyPair keyPair = keyPairGenerator.generateKeyPair();

X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
X500Principal dnName = new X500Principal("CN=Sergey");
certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));
certGen.setSubjectDN(dnName);
certGen.setIssuerDN(caCert.getSubjectX500Principal());
certGen.setNotBefore(validityBeginDate);
certGen.setNotAfter(validityEndDate);
certGen.setPublicKey(keyPair.getPublic());
certGen.setSignatureAlgorithm("SHA256WithRSAEncryption");

certGen.addExtension(X509Extensions.AuthorityKeyIdentifier,false,new AuthorityKeyIdentifierStructure(caCert));
certGen.addExtension(X509Extensions.SubjectKeyIdentifier,new SubjectKeyIdentifierStructure(keyPair.getPublic()));

X509Certificate cert = certGen.generate(caCertPrivateKey,"BC");

验证通过没有例外,这意味着从我的角度来看,它是由caCert成功签署的:

cert.verify(caCert.getPublicKey());

然后我解码它到PEM基地64:

PEMWriter pemWriter = new PEMWriter(new PrintWriter(System.out));
pemWriter.writeObject(cert);
pemWriter.flush();

我在输出中得到这样的东西:

—–开始认证—–

MIIDDjCCAnegAwIBAgIBFDAN ……..

—–证书结束—–

当我打开它,我看到下一个:

为什么没有通过caCert成功签名的认证链?

我的代码需要更改才能看到我所期望的认证链?

解决方法

我能找到解决方案.实际代码按预期工作.我没有看到证书链,因为我的caRoot证书没有添加到信任的商店.在将我的签名证书添加到受信任的根认证中心后,我会按照我的预期看到整个认证链.

Java的x509证书解析库

Java的x509证书解析库

任何推荐的Java加密库。我需要的是解析X.509证书以提取其中包含的信息的能力。

谢谢

答案1

小编典典

在Java中,为java.security.cert.CertificateFactory。

“用于X.509的证书工厂必须返回作为java.security.cert.X509Certificate实例的证书”

org.bouncycastle.asn1.x500.X500NameStyle的实例源码

org.bouncycastle.asn1.x500.X500NameStyle的实例源码

项目:gwt-crypto    文件:RFC4519Test.java   
public void performtest()
    throws Exception
{
    X500NameStyle style = RFC4519Style.INSTANCE;

    for (int i = 0; i != attributeTypes.length; i++)
    {
        if (!attributeTypeOIDs[i].equals(style.attrNametoOID(attributeTypes[i])))
        {
            fail("mismatch for " + attributeTypes[i]);
        }
    }

    byte[] enc = Hex.decode("305e310b300906035504061302415531283026060355040a0c1f546865204c6567696f6e206f662074686520426f756e637920436173746c653125301006035504070c094d656c626f75726e653011060355040b0c0a4173636f742056616c65");

    X500Name n = X500Name.getInstance(style,X500Name.getInstance(enc));

    if (!n.toString().equals("l=Melbourne+ou=Ascot Vale,o=The Legion of the Bouncy Castle,c=AU"))
    {
        fail("Failed composite to string test got: " + n.toString());
    }

    n = new X500Name(style,"l=Melbourne+ou=Ascot Vale,c=AU");

    if (!Arrays.areEqual(n.getEncoded(),enc))
    {
        fail("re-encoding test after parse Failed");
    }
}
项目:nsi-dds    文件:DnAuthorizationProvider.java   
@Override
public boolean authorize(String dn,String operation,String resource) {
    boolean authorized = config.getAccessControlList().isAuthorized(dn,operation,resource);

    if (log.isInfoEnabled()) {
        StringBuilder sb = new StringBuilder();
        if (authorized) {
            sb.append("Authorized: ");
        }
        else {
            sb.append("Rejected: ");
        }

        if (Strings.isNullOrEmpty(dn)) {
            sb.append("<null DN>");
        }
        else {
            X500NameStyle x500NameStyle = ExtendedRFC4519Style.INSTANCE;
            X500Name principal = new X500Name(dn);
            sb.append(x500NameStyle.toString(principal));
        }

        sb.append(",");
        sb.append(operation);
        sb.append(" ");
        sb.append(resource);

        log.info(sb.toString());
    }

    return authorized;
}
项目:nsi-dds    文件:ExtendedRFC4519Test.java   
@Test
public void performtest() throws Exception
{
    X500NameStyle style = ExtendedRFC4519Style.INSTANCE;

    for (int i = 0; i != attributeTypes.length; i++)
    {
        if (!attributeTypeOIDs[i].equals(style.attrNametoOID(attributeTypes[i])))
        {
            fail("mismatch for " + attributeTypes[i]);
        }
    }

    byte[] enc = Hex.decode("305e310b300906035504061302415531283026060355040a0c1f546865204c6567696f6e206f662074686520426f756e637920436173746c653125301006035504070c094d656c626f75726e653011060355040b0c0a4173636f742056616c65");

    X500Name n = new X500Name(style,enc))
    {
        fail("re-encoding test after parse Failed");
    }
}
项目:irma_future_id    文件:JcaX500NameUtil.java   
public static X500Name getIssuer(X500NameStyle style,X509Certificate certificate)
    {
try
{
        return X500Name.getInstance(style,PrincipalUtil.getIssuerX509Principal(certificate).getEncoded());
}
catch (Exception e)
{
   throw new IllegalStateException(e.toString());
}
    }
项目:irma_future_id    文件:JcaX500NameUtil.java   
public static X500Name getSubject(X500NameStyle style,PrincipalUtil.getSubjectX509Principal(certificate).getEncoded());
}
catch (Exception e)
{
   throw new IllegalStateException(e.toString());
}
    }
项目:irma_future_id    文件:RFC4519Test.java   
public void performtest()
    throws Exception
{
    X500NameStyle style = RFC4519Style.INSTANCE;

    for (int i = 0; i != attributeTypes.length; i++)
    {
        if (!attributeTypeOIDs[i].equals(style.attrNametoOID(attributeTypes[i])))
        {
            fail("mismatch for " + attributeTypes[i]);
        }
    }

    byte[] enc = Hex.decode("305e310b300906035504061302415531283026060355040a0c1f546865204c6567696f6e206f662074686520426f756e637920436173746c653125301006035504070c094d656c626f75726e653011060355040b0c0a4173636f742056616c65");

    X500Name n = new X500Name(style,enc))
    {
        fail("re-encoding test after parse Failed");
    }
}
项目:bc-java    文件:JcaX500NameUtil.java   
public static X500Name getIssuer(X500NameStyle style,PrincipalUtil.getIssuerX509Principal(certificate).getEncoded());
}
catch (Exception e)
{
   throw new IllegalStateException(e.toString());
}
    }
项目:bc-java    文件:JcaX500NameUtil.java   
public static X500Name getSubject(X500NameStyle style,PrincipalUtil.getSubjectX509Principal(certificate).getEncoded());
}
catch (Exception e)
{
   throw new IllegalStateException(e.toString());
}
    }
项目:bc-java    文件:RFC4519Test.java   
public void performtest()
    throws Exception
{
    X500NameStyle style = RFC4519Style.INSTANCE;

    for (int i = 0; i != attributeTypes.length; i++)
    {
        if (!attributeTypeOIDs[i].equals(style.attrNametoOID(attributeTypes[i])))
        {
            fail("mismatch for " + attributeTypes[i]);
        }
    }

    byte[] enc = Hex.decode("305e310b300906035504061302415531283026060355040a0c1f546865204c6567696f6e206f662074686520426f756e637920436173746c653125301006035504070c094d656c626f75726e653011060355040b0c0a4173636f742056616c65");

    X500Name n = new X500Name(style,enc))
    {
        fail("re-encoding test after parse Failed");
    }
}
项目:ipack    文件:JcaX500NameUtil.java   
public static X500Name getIssuer(X500NameStyle style,X509Certificate certificate)
{
    return X500Name.getInstance(style,certificate.getIssuerX500Principal().getEncoded());
}
项目:ipack    文件:JcaX500NameUtil.java   
public static X500Name getSubject(X500NameStyle style,certificate.getSubjectX500Principal().getEncoded());
}
项目:Aki-SSL    文件:JcaX500NameUtil.java   
public static X500Name getIssuer(X500NameStyle style,certificate.getIssuerX500Principal().getEncoded());
}
项目:Aki-SSL    文件:JcaX500NameUtil.java   
public static X500Name getSubject(X500NameStyle style,certificate.getSubjectX500Principal().getEncoded());
}
项目:irma_future_id    文件:JcaX500NameUtil.java   
public static X500Name getIssuer(X500NameStyle style,certificate.getIssuerX500Principal().getEncoded());
}
项目:irma_future_id    文件:JcaX500NameUtil.java   
public static X500Name getSubject(X500NameStyle style,certificate.getSubjectX500Principal().getEncoded());
}
项目:bc-java    文件:JcaX500NameUtil.java   
public static X500Name getIssuer(X500NameStyle style,certificate.getIssuerX500Principal().getEncoded());
}
项目:bc-java    文件:JcaX500NameUtil.java   
public static X500Name getSubject(X500NameStyle style,certificate.getSubjectX500Principal().getEncoded());
}

关于用Java的Bouncy Castle自签名的X509证书java签名验签的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于c# – 如何使用BouncyCastle生成根证书,然后使用由该根证书签名的站点证书?、java – 使用带有证书路径(cert chain)的bouncycastle创建x.509证书、Java的x509证书解析库、org.bouncycastle.asn1.x500.X500NameStyle的实例源码等相关内容,可以在本站寻找。

此处将为大家介绍关于NameNotFoundException:仅当尝试从Eclipse Kepler发布而不是Indigo时尝试查找“ jdbc”时的详细内容,此外,我们还将为您介绍关于ClassNotFound: KeeperException$NoNodeException、ClassNotFoundException: com.mysql.jdbc.Driver、ClassNotFoundException:com.microsoft.sqlserver.jdbc、ClassNotFoundException:com.mysql.jdbc.Driver的有用信息。

本文目录一览:

NameNotFoundException:仅当尝试从Eclipse Kepler发布而不是Indigo时尝试查找“ jdbc”时

NameNotFoundException:仅当尝试从Eclipse Kepler发布而不是Indigo时尝试查找“ jdbc”时

我可以使用oepe 12.1.1.1.1将Web应用从Eclipse Indigo 3.7.2发布到Oracle Weblogic 12c(12.1.1)AdminServer

但是,使用oepe 12.1.2.2导入到Eclipse Kepler 4.3.1中的完全相同的Web应用程序无法发布,并带有以下(相当常见)的异常,我正在尝试找出原因?…

NameNotFoundException:尝试查找’jdbc.oraclexe’时未找到子上下文’jdbc’。解决 ‘’; 剩余名称“ jdbc / oraclexe”];链接剩余名称:“ jdbc / oraclexe”

Weblogic 12c数据源绝对可用,并且我必须假定在从Indigo发布应用程序时,它的配置正确,并且应用程序部署和运行没有问题。

我还假设applicationContext.xml,web.xml和weblogic.xml中的映射是正确的,因为从Indigo发布时再次没有问题。映射如下…

src \ main \ webapp \ WEB-INF \ spring \ applicationContext.xml

<bean id="dataSource"> <property name="jndiName" value="java:comp/env/jdbc/oraclexe" /></bean>

src \ main \ webapp \ WEB-INF \ web.xml

<resource-ref> <description>Oracle Weblogic Connection Pool (oraclexe)</description> <res-ref-name>jdbc/oraclexe</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <mapped-name>jdbc/oraclexe</mapped-name></resource-ref>

build \ weboutput \ WEB-INF \ weblogic.xml

<resource-description> <res-ref-name>jdbc/oraclexe</res-ref-name> <jndi-name>oraclexe</jndi-name></resource-description>

我想知道weblogic.xml是否在部署过程中不可用(即未将其复制到src \ main \ webapp \ WEB-INF文件夹中),而不是jndiName / resource-ref / res之间的映射问题-ref自己命名?我尝试将weblogic.xml直接放在src \ main \ webapp \ WEB-INF文件夹中,但是遇到相同的异常。

我唯一的另一种想法是Indigo oepe 12.1.1.1.1很乐意发布到Weblogic 12.1.1,但是Kepler oepe 12.1.2不好,我应该发布到Weblogic 12.1.2服务器吗?

答案1

小编典典

经过大约一个星期的反复试验/消除过程,我设法解决了这个问题,并更好地了解了必要的映射。正如Elliott怀疑的那样,这是JNDI查找的问题。当它从Indigo发布到weblogic 12.1.1时,它(意外地)按预期工作(这一点我仍然不确定为什么),这使事实更加复杂。

我最初解决此问题的尝试着重于weblogic.xml中的映射。当我发布到Weblogic服务器时,我错误地认为在解析数据源时已引用了该引用。事实证明并非如此,我的配置不需要weblogic.xml资源描述。

在applicationContext.xml中保持不变…

<bean id="dataSource"> <property name="jndiName" value="java:comp/env/jdbc/oraclexe" /></bean>

但是,java:comp / env / jdbc / oraclexe的jndiName值映射到web.xml res-ref-name值jdbc / oraclexe(而不是我错误地假设的weblogic.xml res-ref-name)。 ..

在web.xml中映射的名称已经修改…

<resource-ref> <description>Oracle Weblogic console JDBC Data Source</description> <res-ref-name>jdbc/oraclexe</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <mapped-name>oraclexe</mapped-name></resource-ref>

…然后是映射名称值oraclexe映射到Weblogic控制台JDBC数据源JNDI名称。

现在已经完全省略了weblogic.xml中的resource-description节点,因为在此特定配置中未引用该节点。

ClassNotFound: KeeperException$NoNodeException

ClassNotFound: KeeperException$NoNodeException

根据网上的教程建立了两个项目,预备用JMeter做压测,在运行DemoServiceMain后报错:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/zookeeper/KeeperException$NoNodeException
    at com.alibaba.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter.connect(CuratorZookeeperTransporter.java:27)
    at com.alibaba.dubbo.remoting.zookeeper.ZookeeperTransporter$Adaptive.connect(ZookeeperTransporter$Adaptive.java)
    at com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry.<init>(ZookeeperRegistry.java:69)
    at com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistryFactory.createRegistry(ZookeeperRegistryFactory.java:38)
    at com.alibaba.dubbo.registry.support.AbstractRegistryFactory.getRegistry(AbstractRegistryFactory.java:96)
    at com.alibaba.dubbo.registry.RegistryFactory$Adaptive.getRegistry(RegistryFactory$Adaptive.java)
    at com.alibaba.dubbo.registry.integration.RegistryProtocol.getRegistry(RegistryProtocol.java:202)
    at com.alibaba.dubbo.registry.integration.RegistryProtocol.export(RegistryProtocol.java:136)
    at com.alibaba.dubbo.qos.protocol.QosProtocolWrapper.export(QosProtocolWrapper.java:54)
    at com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper.export(ProtocolListenerWrapper.java:55)
    at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper.export(ProtocolFilterWrapper.java:98)
    at com.alibaba.dubbo.rpc.Protocol$Adaptive.export(Protocol$Adaptive.java)
    at com.alibaba.dubbo.config.ServiceConfig.doExportUrlsFor1Protocol(ServiceConfig.java:506)
    at com.alibaba.dubbo.config.ServiceConfig.doExportUrls(ServiceConfig.java:358)
    at com.alibaba.dubbo.config.ServiceConfig.doExport(ServiceConfig.java:317)
    at com.alibaba.dubbo.config.ServiceConfig.export(ServiceConfig.java:216)
    at com.alibaba.dubbo.config.spring.ServiceBean.onApplicationEvent(ServiceBean.java:123)
    at com.alibaba.dubbo.config.spring.ServiceBean.onApplicationEvent(ServiceBean.java:49)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:393)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:347)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:883)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:546)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
    at com.alibaba.dubbo.container.spring.SpringContainer.start(SpringContainer.java:46)
    at com.alibaba.dubbo.container.Main.main(Main.java:86)
    at com.demo.dubbo.provider.DemoServiceMain.main(DemoServiceMain.java:6)
Caused by: java.lang.ClassNotFoundException: org.apache.zookeeper.KeeperException$NoNodeException
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 30 more
 

发现curator与zkclient如果不同时依赖,其中一个就会报ClassNotFoundException;

然后同时依赖的时候版本不一致,一样会报错

ClassNotFoundException: com.mysql.jdbc.Driver

ClassNotFoundException: com.mysql.jdbc.Driver

beans.xml 配置文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop   
   	http://www.springframework.org/schema/aop/spring-aop.xsd">
        
        <context:property-placeholder location="classpath:jdbc.properties" /> 
     
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="${jdbc.driverClassName}"/> 
    <property name="url" value="${jdbc.url}"/> 
    <property name="username" value="${jdbc.username}"/> 
    <property name="password" value="${jdbc.password}"/>
  </bean> 
<bean id="userDao" class="dao.impl.UserDaoImpl">
<property name="dataSource" ref="dataSource"></property>
</bean>

<bean id="userInterceptor" class="aop.UserInterceptor"></bean>
<bean id="userService" class="service.UserService">
<property name="userDao" ref="userDao"></property>
</bean>



</beans>

src 下新建 jdbc.properties 内容如下:

jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://localhost:3306/spring 
jdbc.username=root 
jdbc.password=****

运行时报 ClassNotFoundException: com.mysql.jdbc.Driver 异常,mysql 的驱动包明明是加进去的。更关键的一点是不使用占位符,即如下:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
	     <property name="url" value="jdbc:mysql://localhost:3306/spring"/> 
	     <property name="username" value="root"/> 
	     <property name="password" value="19870509"/> 
  </bean>

这样运行是正常的。后来发现异常 信息里有这么一句话

at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1420)

我在想有可能是

commons.dbcp.BasicDataSource

这个类无法加载 mysql 驱动的问题。经过好长时间的查找,发现改成

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

即正常。至此,大功告成!

ClassNotFoundException:com.microsoft.sqlserver.jdbc

ClassNotFoundException:com.microsoft.sqlserver.jdbc

当我在Eclipse IDE下运行Web应用程序时,一切正常。但是,当我将项目导出到war文件中并部署到tomcat中时,我得到以下消息:

java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc

我尝试将sqljdbc4.jar放到任何地方:

  • catalina-home \ lib目录
  • WEB-INF \ lib目录
  • 他们都

我想念什么?环境:tomcat 6.0.20,SQL Server 2005

ClassNotFoundException:com.mysql.jdbc.Driver

ClassNotFoundException:com.mysql.jdbc.Driver

这个问题已经在这里问了很多,但我仍然无法解决我的问题:我把mysql-connector-java-5.1.18-binC:\ProgramFiles\Java\jre6\lib\ext文件夹中。我有这个代码:

    // Load the database driver    Class.forName("com.mysql.jdbc.Driver");    // Get a connection to the database    Connection conn = DriverManager.getConnection(                        "jdbc:mysql://localhost:3306/mysql", "root", "4958ps");    // Get a statement from the connection    Statement stmt = conn.createStatement() ;    // Execute the query    ResultSet rs = stmt.executeQuery( "SELECT * FROM Cust" ) ;    // Loop through the result set    while( rs.next() )        System.out.println( rs.getString(1) ) ;    // Close the result set, statement and the connection    rs.close() ;    stmt.close() ;    conn.close() ;} catch( SQLException se ) {    System.out.println( "SQL Exception:" ) ;    // Loop through the SQL Exceptions    while( se != null ) {        System.out.println( "State  : " + se.getSQLState()  ) ;        System.out.println( "Message: " + se.getMessage()   ) ;        System.out.println( "Error  : " + se.getErrorCode() ) ;        se = se.getNextException() ;    }          } catch( Exception e ) {    e.printStackTrace();}

我得到一个ClassNotFoundException与以下堆栈跟踪:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driverat java.net.URLClassLoader$1.run(URLClassLoader.java:202)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(URLClassLoader.java:190)at java.lang.ClassLoader.loadClass(ClassLoader.java:306)at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)at java.lang.ClassLoader.loadClass(ClassLoader.java:247)at java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Class.java:169)at pack.Test.main(Test.java:14)

我也将CLASSPATH变量更改为C:\Program Files\Java\jre6\lib\ext\mysql-connector-java-5.1.18-bin 任何想法?

答案1

小编典典

您下载的zip文件应包含一个名为mysql-connector-java-5.0.8-bin.jar或类似文件。版本可能有所不同。检查它是否存在,并检查它是否直接在您的类路径中(而不在子目录等中)。

如果还可以,请检查您的classpath变量是否未被其他内容覆盖。如果您手动执行程序,请执行以下操作:java -cp "C:\ProgramFiles\Java\jre6\lib\ext\mysql-connector-java-5.0.8-bin.jar:." YourClass

如果您使用的是诸如eclipse之类的IDE,请在此处检查您的构建路径设置。(在Eclipse中,您将右键单击项目->属性->
Java构建路径->添加外部JAR,然后提供连接器的路径… jar。

今天的关于NameNotFoundException:仅当尝试从Eclipse Kepler发布而不是Indigo时尝试查找“ jdbc”时的分享已经结束,谢谢您的关注,如果想了解更多关于ClassNotFound: KeeperException$NoNodeException、ClassNotFoundException: com.mysql.jdbc.Driver、ClassNotFoundException:com.microsoft.sqlserver.jdbc、ClassNotFoundException:com.mysql.jdbc.Driver的相关知识,请在本站进行查询。

本文标签: