Java – CertificateException: No name matching xxx found

6 04 2011

At paysafecard we have a lot to deal with certificates. For our test systems we use one SSL certificate for different sub-domains, e.g. one certificate for “https://test.yunacard.com” used for “https://testa.yunacard.com” and “https://testb.yunacard.com”.

But when you do this, you get a javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching xxx found when trying to connect e.g. with new java.net.URL(url).openStream();

The work around for this problem is, to include the following in your Java class (found here):

public class ClassBla {
  static {
    javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
      public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
        return true;
      }
   });
  }
  ..
}

There is a way to import a certificate issued to a different domain for another certain (sub-)domain with the java keytool as well.





Java: Rounding error from Double to BigDecimal

31 01 2011

Today’s amusement in my job:

Rounding error from Double to BigDecimal, see java docs for public BigDecimal(double val).

Java creates a BigDecimal which is exactly equal to 0.1 (an unscaled value of 1, with a scale of 1), but it is actually equal to 0.1000000000000000055511151231257827021181583404541015625

 

Workaround 1: Convert Double to String before converting to BigDecimal, as suggested in the java docs for BigDecimal

BigDecimal b = new BigDecimal(Double.toString(double));

 

Workaround 2: Round!
Double d = ...; // your (rounded) value
BigDecimal b = new BigDecimal(d).setScale(2, BigDecimal.ROUND_HALF_UP);

.

Another problem with Double in Java: http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/





SQL – Drop constraint without specifying its name

13 02 2009

Drop a UNIQUE constraint in relational databases like Oracle without specifying its name by referencing the column or columns:

ALTER TABLE Employee DROP UNIQUE (name)

.

But if you want to drop a NOT NULL constraint  without specifying its name you have to use a workaround, if there is an index on the column:

ALTER TABLE Employee ADD (name_ varchar(32));
update Employee set name_ = name;
ALTER TABLE Employee DROP COLUMN name;
ALTER TABLE Employee ADD (name varchar(32));
update Employee set name = name_;
ALTER TABLE Employee DROP COLUMN name_;

.

To drop a NOT NULL constraint in Oracle you can MODIFY an unindexed column:

ALTER TABLE Employee MODIFY name NULL;

.

ps. Dieses Mal ein How-To-Posting aus meinem spannenden Leben als Software-Entwicklerin in Englisch, zum leichteren Wiederfinden in Suchmaschinen.





Multiple writable mappings in Java Persistence API

26 11 2008

Seit kurzem setzte ich mich mit der Java Persistence API auseinander, das mit Hibernate und dem von uns eingesetzten Oracle Toplink implementiert wurde.

Folgende Fehlermeldung beschäftigte mich bei einer OneToMany-Relation

Multiple writable mappings exist for the field [tabltenname.spaltenname]. Only one may be defined as writable, all others must be specified read-only.

Die Lösung war das explizite deklarieren der Spalte als “read only”, was man mit den Optionen nullable=false, insertable=false und updatable=false bei der @Column-Annotation erreicht.

Spannend, nicht? ;)

java-coffee-cup-300x219





oracle update mit inner join

25 08 2008

wieder mal ein kleines howto, für etwas, das mir wieder mal auf die schnelle nicht eingefallen ist.

wenn man in einer tabelle A alle spalten a auf einen bestimmten wert setzen möchte, die eine bestimmte bedingung (A.b = B.b) mit einer anderen tabelle B erfüllen, geht das in oracle so:

UPDATE A
set A.a =
(SELECT B.a
FROM B
WHERE A.b = B.b)

in access würde es so gehen:

update A inner join B on
A.b = B.b
SET A.a = B.a

in SQL server so:
UPDATE A
SET A.a = B.a
INNER JOIN B
ON A.b = B.b

siehe z.b. auch sql-tutorial





convert date to calendar in java

15 08 2008

heute wieder mal googlen müssen, weils mir wieder mal entfallen ist, deswegen gleich ein beitrag für die howto section.

in java sind die alten, sehr hilfreichen funktionen von java.util.Date, die teile des datums zurückgeben, wie date.getMonth(), leider depricated, und zwar schon seit v. 1.1. stattdessen wird heute java.util.Calendar verwendet. …und das geht so ;)

Date date = .. // das datum, das man aufsplitten will;
Calendar cal = Calendar.getInstance();
cal.setTime(date);
// monat fängt mit 0 an!
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);
int year = cal.get(Calendar.YEAR);

beim suchen hab ich eine hilfreiche seite gefunden mit vielen tutorials und beispielen gefunden.

.

wer ein formatiertes datum braucht, nimmt am besten:


Date date = new Date();
java.text.SimpleDateFormat df = new java.text.SimpleDateFormat( "yyyyMMdd" );





oracle group concat

14 08 2008

oft habe ich mir schon die frage gestellt, wie der einfachste weg ist, mehrere strings, die aus einem SQL statement in mehreren rows kommen, zu einem string in einer row zusammenzufassen. im mysql gibt es die funktion group_concat(), die in oracle aber leider nicht vorkommt.

das problem im detail ist, dass das statement für ein dataset:

select
   'A' as text
from
   dual
union
select
   'B' as text
from
   dual

folgendes liefert:

text

A
B

…, man aber manchmal den text in einem einzigen string in einer row und nicht in mehreren rows zurückbekommen will, also “A B”

die lösung dafür ist entweder mit plsql prozeduren zu arbeiten (was ich bis jetzt immer gemacht habe) oder auf hierarchische statements zurückzugreifen. folgendes knappes statement liefert die lösung

select
   ltrim(max(sys_connect_by_path(text, ' ')), ' ')
from
(
   select
      text,
      rownum as rn
   from
   (
      // dataset, z.b. siehe oben
   )
)
start with rn = 1
connect by prior rn=rn-1

eine etwas komplexere lösung ist im tom kyte blog zu finden





XSQL treibt mich in den wahnsinn

16 07 2008

mal wieder was aus meinem spannenden alltag als software-entwickler:

Oracle XSQL Servlet gibt so nette fehlermeldungen aus wie “Ungültiger Spaltenindex“, die aber irgendwie nicht direkt mit dem Index, der Anzahl oder Reihenfolge der Spalten des SQL statements oder ähnlichem zu tun hatte…

die lösung des problems war aber bald geklärt, da ich mit hilfe eines lieben arbeitskollegen erkannte, dass die anzahl der bind-params nicht mit der anzahl der verwendeten params übereinstimmt.

in xsql müssen alle params, die mit dem <xsql:query .. />-tag bind-params übergeben werden verwendet werden. diese können mit einem fragezeichen ? oder direkt mit dem prefix “:” angesprochen werden, aber nicht zu wenige, keine doppelten verwendungen und nicht zu viele… eben genau richtig passend muss es sein. das ist die banale lösung.

.

wieso können programmierer dieser tools nicht vernünftige fehlermeldungen ausgeben? sowas wie “Anzahl der bind-params stimmt nicht mit der Anzahl der verwendeten Params überein”. da wär ich und wahrscheinlich alle xsql progger sehr glücklich. ein anderes beispiel für grauenhafte fehlermeldungen sind die gute, alte NullPointerException in Java oder “undefined is not a function” in helma ;)

.

nachtrag: die selbe lösung gibt es auch bei dr fehlermeldung “fehlender IN- oder OUT-Parameter auf Index:: i“. hier wird ein parameter, der mit bind-params gesetzt wird, öfter im SQL verwendet, als er definiert wurde. die lösung: den parameter sooft in bind-params übergeben, wie er verwendet wird!





torque throws ORA-01424 – purge the recycle bin

10 06 2008

schon wieder passiert und wieder mal länger nach der lösung gesucht, bis es mir wieder (spät, aber doch) eingefallen ist:

wird eine ORA-01424 oracle fehlermeldung beim generieren der java-klassen aus der DB über die torque geworfen, hat man wohl wieder das magische wort purge beim löschen der tabellen vergessen.

drop table drop_me purge
/

der fehler tritt auf, da die tabellen nicht vollständig gelöscht wurden und somit im recycle bin der DB liegen. purge bereinigt den papierkorb, bzw wird beim drop einer tabelle diese gleich vollständig gelöscht.

der fehler ORA-01424 deutet eigentlich auf ein fehlendes zeichen nach dem escape character hin und führt in diesem zusammenhang leider nur in eine falsche richtung.





escape character & (ampersand) in oracle

3 06 2008

SQL-editors prompt for variables prefixed with ‘&’ in SQL statements

disable ampersand (kaufmännisches und) ‘&’ with “set define off” in TOAD or SQL*Plus

e.g.

set define off;
insert into PERSON(ID, NAME) values (1, ‘you & me’);
set define on;

use “execute as script” instead of “execute statement”








Follow

Get every new post delivered to your Inbox.