2016-11-24 37 views
0

私はGlassfish 4.1.1とJerseyを一緒に働かせようとしています。難しいのは、JSON経由の通信がある場合です。Glassfish 4.1.1とJerseyをJSONと連携させるには?

私は、JSONデータ転送が機能するように多くのソリューションを試しました。ああ、まだ動作していません。

グラスフィッシュとジャージーは「標準」なので、これら2つを組み合わせる標準的な方法はありますか? JSONの正しい設定方法は何ですか?

JSONで作業を開始するたびに、すべての種類のエラーが発生します。 最後のエラーは、私が取得:

 2016-11-25T15:59:52.070+0100|Warning: StandardWrapperValve[Jersey Web Application]: Servlet.service() for servlet Jersey Web Application threw exception 
java.lang.ClassNotFoundException: javax.xml.parsers.ParserConfigurationException not found by org.eclipse.persistence.moxy [228] 
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532) 
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75) 
etc, etc. 

Mavenの依存関係は次のとおりです。

http://maven.apache.org/maven-v4_0_0.xsd ">

<modelVersion>4.0.0</modelVersion> 

<groupId>nl.xyz</groupId> 
<artifactId>GlassfishJerseyJson</artifactId> 
<packaging>war</packaging> 
<version>0.0.1-SNAPSHOT</version> 
<name>GlassfishJerseyJson</name> 

<build> 
    <finalName>GlassfishJerseyJson</finalName> 
    <plugins> 
      <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.1.1</version> 
      <configuration> 
       <failOnMissingWebXml>false</failOnMissingWebXml> 
       <!-- <webXml>src\main\webapp\WEB-INF\web.xml</webXml> --> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>org.glassfish.maven.plugin</groupId> 
      <artifactId>maven-glassfish-plugin</artifactId> 
      <version>2.1</version> 
      <configuration> 
       <glassfishDirectory>${local.glassfish.home}</glassfishDirectory> 
       <user>admin</user> 
       <passwordFile>${local.glassfish.passfile}</passwordFile> 
       <domain> 
        <name>domain1</name> 
        <httpPort>8080</httpPort> 
        <adminPort>4848</adminPort> 
       </domain> 
       <components> 
        <component> 
         <name>${project.artifactId}</name> 
         <artifact>target/${project.build.finalName}.war</artifact> 
        </component> 
       </components> 
       <debug>true</debug> 
       <terse>false</terse> 
       <echo>true</echo> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

    <dependencyManagement> 
     <dependencies> 
      <dependency> 
       <groupId>org.glassfish.jersey</groupId> 
       <artifactId>jersey-bom</artifactId> 
       <version>${jersey.version}</version> 
       <type>pom</type> 
       <scope>import</scope> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>javax</groupId> 
      <artifactId>javaee-web-api</artifactId> 
      <version>7.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.containers</groupId> 
      <artifactId>jersey-container-servlet-core</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.jaxrs</groupId> 
      <artifactId>jackson-jaxrs-json-provider</artifactId> 
      <version>2.6.3</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-annotations</artifactId> 
      <version>2.6.3</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.media</groupId> 
      <artifactId>jersey-media-json-jackson</artifactId> 
      <version>2.5.1</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>1.2.17</version> 
     </dependency> 
    </dependencies> 
    <properties> 
     <jersey.version>2.24.1</jersey.version> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 
</project> 

jQueryのコール次のとおりです。

function findResource() { 
    $.ajax({ 
     type: 'GET', 
     accepts: { json: "application/json, text/javascript" }, 
     dataType: "json", 
     url: resourceURL, 
     success: function(data){ 
      alert("Back from resource: name=" + data.name); 
     }, 
     error: function(jqXHR, textStatus, errorThrown){ 
      alert('Back from resource error: ' + textStatus + ' - Error: ' + errorThrown + " - Response: " + jqXHR.responseText); 
     } 
    }); 
} 

リソースjavaファイル:

@Path("myresource") 
public class MyResource { 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Wine2 getIt() { 
     Wine2 w = new Wine2(); 
     w.setId(100); 
     w.setCountry("france"); 
     return w; 
    } 
} 

設定:オプション1:web.xmlの(最初のラインアウトデフォルトは左):

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
    <servlet> 
     <servlet-name>Jersey Web Application</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>jersey.config.server.provider.packages</param-name> 
      <param-value>org.coenraets.cellar</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Jersey Web Application</servlet-name> 
     <url-pattern>/webapi/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

設定:オプション2:MyApplication.java

import java.util.HashSet; 
import java.util.Set; 
import javax.ws.rs.core.Application; 

public class MyApplication extends Application { 
    @Override 
    public Set<Class<?>> getClasses() { 
     Set<Class<?>> s = new HashSet<Class<?>>(); 
     s.add(MyResource.class); 
     s.add(WineResource.class); 
     return s; 
    } 
} 
+0

リソースアノテーションを '@Produces(MediaType.APPLICATION_JSON)'に変更します。中括弧を取り除きます。 – Mike

+0

はい、しました。変更なし、同じエラー。 – tjm1706

答えて

2

Yesssss !!!!私は完全な答えを見つけました。

溶液は、元の(上記参照)MavenのLIBSを用いてverion 2.5.0(または類似の)へのGlassFish /モジュールフォルダ内の次のファイルを変更することである。

  • org.eclipse.persistence 。
  • org.eclipse.persistence.core.jar

ソリューションは、[このWebページ] [1]と同様のサイトを経由して来たjarファイル。

この記事などでは、$ Glassfish/modulesのorg.eclipse.persistence.moxy.jarファイルが2.5.0バージョンに置き換えられています。

0

がライブラリに追加してください: Java EE7 APIライブラリ、JAX-RS、Jersey

+0

mavenファイルまたはlib-dependenciesを追加できますか?私はすでに多くの変種を試しています。主なものはJSONの部分です。 – tjm1706

+0

jax-rsとJerseyには、次のような例があります。https://stackoverflow.com/questions/25612117/how-do-you-include-jax-rs-with-jersey-in-maven Java EE7 APIの場合:https: //mvnrepository.com/artifact/javax/javaee-api/7.0 –

2

だけではなく、あなたのMOXYの依存関係の次のコマンドを使用します。

<dependency> 
     <groupId>com.fasterxml.jackson.jaxrs</groupId> 
     <artifactId>jackson-jaxrs-json-provider</artifactId> 
     <version>2.6.3</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>2.6.3</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-json-jackson</artifactId> 
     <version>2.5.1</version> 
     <scope>provided</scope> 
    </dependency> 

LIBSは、したがって、提供範囲が十分である、標準Glassfishの4のインストールに含まれています。

そして、あなたはこれらの依存関係を削除する必要があります。

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.json</artifactId> 
    <version>1.0.2</version> 
</dependency> 
<dependency> 
    <groupId>javax.json</groupId> 
    <artifactId>javax.json-api</artifactId> 
    <version>1.0</version> 
    <scope>provided</scope> 
</dependency> 

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-moxy</artifactId> 
    <!-- <version>2.4.1</version> 
    <scope>provided</scope> --> 
</dependency> 

あなたがそれらを必要としないとジャージーの依​​存関係のほとんどは提供さに設定することができます。

私はa gistというプロジェクトを作成しましたが、pom.xml、web.xml、MyResource.class、Cow.classの4つのファイルしかありません。これには、基本的なセットアップに必要なものがすべて含まれており、追加のlibsなしでGlassfish 4で動作します。

+0

このクラスの使い方を見つけて、削除してみてください。 – unwichtich

+0

これらのクラスはどこで使用しますか?あなたはそれらを必要としません。 – unwichtich

+0

OK、良いアイデア - どうすればこれらのクラスを取り除くことができますか? – tjm1706

0

解決策は、あなたのJerseyアプリケーションをカスタムJSONプロバイダとして提供することです。これは、定義は次のようになりますです:

import com.fasterxml.jackson.annotation.JsonAutoDetect; 
import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.annotation.PropertyAccessor; 
import com.fasterxml.jackson.databind.DeserializationFeature; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.SerializationFeature; 
import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; 

import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 

@Produces(MediaType.APPLICATION_JSON) 
public class CustomJsonProvider extends JacksonJaxbJsonProvider { 

    private static final ObjectMapper MAPPER = new ObjectMapper(); 

    static { 
     MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
     MAPPER.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); 
     MAPPER.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.DEFAULT); 
     MAPPER.enable(SerializationFeature.INDENT_OUTPUT); 
    } 

    public CustomJsonProvider() { 
     super(); 
     setMapper(MAPPER); 
    } 
} 

その後ジャージーアプリケーションコンテキストにカスタムJSONプロバイダーを登録します機能:

import javax.ws.rs.core.Feature; 
import javax.ws.rs.core.FeatureContext; 
import javax.ws.rs.ext.MessageBodyReader; 
import javax.ws.rs.ext.MessageBodyWriter; 

public class MarshallingFeature implements Feature { 

    @Override 
    public boolean configure(FeatureContext context) { 
     context.register(CustomJsonProvider.class, MessageBodyReader.class, MessageBodyWriter.class); 
     return true; 
    } 
} 

最後に、ジャージーApplicationクラスのコンストラクタにその機能を登録します。

import javax.ws.rs.ApplicationPath; 
import org.glassfish.jersey.server.ResourceConfig; 

@ApplicationPath("ws") 
public class ApplicationConfig extends ResourceConfig { 

    public ApplicationConfig() { 

     register(MarshallingFeature.class); 

     // register ressource classes 
    } 
} 

そして、これらは、あなたのMavenのpom.xmlに追加する必要がある依存関係は以下のとおりです。

<dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-json-jackson</artifactId> 
     <version>2.5.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>2.8.0</version> 
     <type>jar</type> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.8.2</version> 
     <type>jar</type> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.jaxrs</groupId> 
     <artifactId>jackson-jaxrs-json-provider</artifactId> 
     <version>2.8.6</version> 
     <type>jar</type> 
    </dependency> 

希望します。

関連する問題