Java, Spring

How to expose the resourceId with Spring-Data-Rest?

Spring-Data-Rest is a quite new project in the Spring family of pivotal. The intention of this project is to reduce the boilercode of controllers and services when you need only CRUD methods on an entity for your REST resources. – Quote from project page is “Spring-Data-Rest makes it easy to expose JPA based repositories as RESTful endpoints.”

One requirement I had was to expose the CRUD identifier and database primary key which is annotated with @Id. In my case that was needed because the field was functional required. For that I had to expose it because at the standard configuration the ID field is only visible on the resource path, but not on the JSON body.

To expose it you need to configure your RepositoryRestMvcConfiguration like that:

@Configuration
public class MyCoolConfiguration extends RepositoryRestMvcConfiguration {

    @Override
    protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.exposeIdsFor(FooEntity.class);
    }
}

The entity class could look like that:

@Entity
public class FooEntity {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    Long id;

    String name;
}

With this configuration you will receive your entity id back.

{
  "_links":{
  "self":{
    "href":"http://localhost:8081/api/fooentity/1"
  }
},
  "id":1,
  "name":"bar"
}

Additional Comment from a Spring-Developer: URI stands for unique, resource, *identifier* – The URI *is* the id. What I expose here is a database internals.

Standard
Java, Maven

Eigenen Repository Server in Maven einrichten

Um sich mit einem eigenen Maven Repository Server (z.B. Nexus) zu verbinden, der auch noch mit Zugangsdaten (Credentials) abgesichert ist, muss man in der lokalen Maven Configuration folgende Dateien erstellen und Einträge machen:

In deinem lokalem Maven-Ordner (%HOME%-folder) den versteckten Ordner .m2 finden.

Zum Beispiel unter Windows:

  • ‚C:\Users\%username%\.m2‘

oder unter Mac OS X:

  • ‚/Users/%username%/.m2‘

bzw. Unix/Linux

  • ‚/home/%username%/.m2‘

settings-security.xml (Master Passwort für User Credentials)

<settingsSecurity>
  <master>{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}</master>
</settingsSecurity>

Um das Master-Passwort zu generieren ruf folgendes Kommando auf: ‚mvn –encrypt-master-password _password_‘

settings.xml (User Credentials für Maven Repository)

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                     http://maven.apache.org/xsd/settings-1.0.0.xsd">
 <servers>
   <server>
     <id>my.server</id>
     <username>foo</username>
     <password>{COQLCE6DU6GtcS5P=}</password>
   </server>
 </servers>
</settings>

Um das lokale User Passwort zu generieren rufe dann dieses Kommando auf: ‚mvn –encrypt-password _password_‘.

Man kann auch nur die ’settings.xml‘ anlegen mit Klartext Passwort (dies ist natürlich UNSICHER).

Bitte beachtet, dass ihr euer _passwort_ natürlich auf der Konsole eingebt und es somit natürlich im Klartext in der Konsolen-History Datei landet. Also nutzt wie immer am Besten für jeden Server/Service ein anderes Passwort und löscht den Eintrag aus der Konsolen-History Datei raus.

Die dazugehörige Maven POM XML Datei muss dann zusätzlich diese Einträge besitzen:
pom.xml

<!-- Dependency to project from repo -->
<dependencies>
   ...
   <dependency>
       <groupId>com.companyname.projectname</groupId>
       <artifactId>mvn-module-name</artifactId>
       <version>0.0.1-SNAPSHOT</version>
   </dependency>
</dependencies>
...
<!-- Link to repository server -->
<repositories>
     <repository>
         <id>my.server</id>
         <url>http://mvn.companyname.com/nexus/content/repositories/snapshots/</url>
     </repository>
 </repositories>

Danach sollte mit ‘mvn clean install’ die Abhängigkeit (dependency) gefunden werden, um das Projekt ordentlich zu bauen.

Für weitere Fragen und Anmerkungen bin ich wie immer offen.

Standard
Java

Möglichkeiten um die Maven Abhängigkeit grafisch anzuzeigen.

Um in einem Projekt als technisch verantwortlicher Entwickler den Überblick über das Maven Projekt zu behalten ist es nötig die Dependencies zu verstehen, zu kontrollieren und zu überwachen.

Da man bei größeren Projekten verschiedene Module bzw. Subprojekte hat ist es manchmal nicht einfach diesen Überblick zu bewahren. Deshalb sollte man es sich grafisch klar machen wie die verschiedenen Module miteinander interagieren, um darauf zu achten, dass man sich keine Zyklen sowie unnötige Relationen ins Projekt holt.

Nachdem ich es beim ersten Mal mit Hilfe eines Flipcharts selbst dargestellt habe und die verschiedenen POM Dateien (“Project Object Model”) realisiert habe, dachte ich mir, dass dieses Problem doch schon einmal jemand gelöst haben muss. Dadurch könnte die CI (“Continous Integration”) es übernehmen den graphischen Überblick zu erstellen, damit man immer eine Übersicht darüber hat wie sich das Gesamtbild entwickelt.

Ich habe verschiedene Ansätze gefunden, wie man dieses Problem angehen kann:

– Maven Plugins
-> Maven Overview (https://code.google.com/p/maven-overview-plugin)
-> Maven Graph (http://mvnplugins.fusesource.org/maven/1.4/maven-graph-plugin/index.html)
-> … (http://books.sonatype.com/m2eclipse-book/reference/dependencies-sect-analyze-depend.html#fig-dependencies-pom-editor-graph)

– Standalone Apps
-> POM-Parser (https://github.com/roclas/pomParser)

Als erstes habe ich mal das „Maven Overview“ Plugin integriert.

Dafür musste ich folgende Plugin Eintrag ins POM-XML einbetten:

<plugin>
    <groupId>com.googlecode.maven-overview-plugin</groupId>
    <artifactId>maven-overview-plugin</artifactId>
    <version>RELEASE</version>
	<configuration>
		<width>1200</width>
		<height>1200</height>				
        <includes>com.company.product</includes>
		<exclusions>
			<exclusion>
				<scope>test</scope>
			</exclusion>
		</exclusions>                    
        <maxDepth>1</maxDepth>
		<scopes>
        	<scope>compile</scope>
        	<scope>runtime</scope>
        </scopes>  
    </configuration>		        
</plugin>

(1) http://devinthelifeofme.blogspot.de/2009/05/using-maven-overview-plugin.html

Im zweiten Schritt nutzte ich das Standalone Programm.

Dieses musste ich einfach nur auf der Konsole (nachdem „mvn clean install“ ausgeführt wurde) mit folgendem Befehl ausführen:

java -jar pom_parser-X.X.jar _origindir_ _destdir_

Beide Ansätze lieferten tolle Ergebnisse und ich werde es in Zukunft weiterhin benutzen um den Überblick zu behalten.

Welche der Lösungen die bessere ist solltet ihr ausprobieren, indem ihr beide einmal benutzt und schaut welche euren Anforderungen am Nächsten kommt. Dafür könnt ihr entweder zu einem kleinen Meeting einladen, in dem ihr euch für eine gemeinsame Lösung entscheidet oder ihr erstellt eine Entscheidungsmatrix.

Ich bin für Fragen, Hinweise, Verbesserungsvorschläge und sonstige Kommentare immer offen und freue mich darüber.

Standard