- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对当前正在构建的 REST 接口(interface)有疑问。我通常是前端专家,由于没有可用资源,现在处理后端工作。所以请耐心等待我:-)。
这是我所说的类(class):
/**
*
* @author User
*/
@Path("/excel")
public class Excel {
private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
private static final String SERVER_UPLOAD_LOCATION_FOLDER = "C://tmp/";
@POST
@Path("/export")
//@Consumes(MediaType.APPLICATION_JSON)
@Consumes({"application/xml","application/json"})
public Response writeFile(FileContent fileContent){
//Check if anything is null, if so return a server error code 500
String startDateStr = new Date().toString();
try {
JsonParser parser = new JsonParser();
JsonObject element = (JsonObject) parser.parse(fileContent.getContent());
String fileName = startDateStr + Integer.toString(new Random().nextInt(100)) + ".xls";
FileInformation fi = new FileInformation(
fileName,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
);
File file = new File(fileName);
WritableWorkbook workbook = Workbook.createWorkbook(file);
WritableSheet sheet = workbook.createSheet(fileName, 0);
int i = 0;
while(element.get(Integer.toString(i)) != null && !element.get(Integer.toString(i)).getAsJsonArray().isJsonNull()) {
JsonArray line = element.get(Integer.toString(i)).getAsJsonArray();
System.out.println(i);
for(int n = 0; n < line.size(); n++)
{
System.out.println(line.get(n).toString());
Label label = new Label(n,i, line.get(n).toString());
sheet.addCell(label);
}
i++;
}
workbook.write();
workbook.close();
Runnable r = new DeleteThread(file);
new Thread(r).start();
return Response.status(201).entity(fi).header("Access-Control-Allow-Origin", "*").build();
} catch (NullPointerException | IOException | WriteException e ) {
System.out.println(e);
return Response.status(500).build();
}
}
@GET
@Path("/export")
@Produces("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
public Response serveFile(@QueryParam("fileName") String fileName){
File file = new File(fileName);
Response.ResponseBuilder response = Response.ok((Object) file);
response.header("Content-Disposition",
"attachment; filename=" + fileName);
return response.build();
}
@PUT
@Path("/import")
@Produces
public Response putFile() {
/*@FormDataParam("file") FormDataContentDisposition contentDispositionHeader) {
String filePath = SERVER_UPLOAD_LOCATION_FOLDER + contentDispositionHeader.getFileName();
FileHelper.saveFile(fileInputStream, filePath);*/
return Response.status(200).entity("Hallo Friend").build();
}
}
这是我的 POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.range_plan_viz.rest</groupId>
<artifactId>jerseyrangeplan</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>jerseyrangeplan Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.10</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>rangePlanVizRest</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<server>TomcatServer</server>
<path>/restRangePlan</path>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
</project>
这是请求负载的映射器类:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.range_plan_viz.wrapper;
/**
*
* @author User
*/
public class FileContent {
private String content;
public FileContent(String content){
setContent(content);
}
/**
* @return the content
*/
public String getContent() {
return content;
}
/**
* @param content the content to set
*/
public void setContent(String content) {
this.content = content;
}
}
这是响应负载的映射器:
package org.range_plan_viz.wrapper;
import javax.xml.bind.annotation.XmlRootElement;
/**
* Created by User on 12.02.2015.
*/
@XmlRootElement
public final class FileInformation {
private String fileName;
private String contentType;
/**
* Default constructor
* @param content The content of the excel file published by the UI
* @param fileName The name of the file that should be generated published by the UI
* @param contentType The contenType of the file
*/
public FileInformation(
String fileName,
String contentType
){
setFileName(fileName);
setContentType(contentType);
}
/**
* Getter of the fileName
* @return {String} The fileName of the file that should be generated
*/
public String getFileName() {
return fileName;
}
/**
* The setter of the fileName
* @param {String} fileName The fileName of the file that should be
* generated
*/
public void setFileName(String fileName) {
this.fileName = fileName;
}
/**
* The getter of the content type
* @return {String} The contentType of the file that should be generated
*/
public String getContentType() {
return contentType;
}
/**
* The setter of the content type
* @param {String} contentType The contentType of the app that should be
* generated
*/
public void setContentType(String contentType) {
this.contentType = contentType;
}
@Override
public String toString() {
return "FileInformation [fileName=" + getFileName() + ", contenType=" + getContentType() + "]";
}
}
这里是测试它的 JavaScript:
var a =[BigDataMock],
url = "http://localhost:8084/jerseyrangeplan/rest/excel/export"
$.ajax({
url: url,
method: 'post',
crossDomain: true,
contentType: "application/json",
dataType: "json",
data:{
content: JSON.stringify(a)
},
success: function(result, status, xhr) {
window.location.assign(url + "?fileName=" + result.fileName);
},
error: function (responseData, textStatus, errorThrown) {
console.log('POST failed.');
}
});
我想要做的基本上是将前端的大数据集提取到 Excel,然后下载文件。我已经尝试过表单方法,但它仅适用于小型数据集。我们的对象中有 10000 个成员,并且表单剪切了字符串化的字符串,这导致后端出现问题。我还尝试使用 excelbuilder.js,但也不起作用。我在生成 Excel 文件后发送的字节流未从 Java 后端正确解释。现在我想保存excel文件,然后立即在回调中触发下载。
但我不断收到 415 不支持的媒体类型错误。我也遇到了 CORS 过滤器的问题,它似乎无法正常工作。
有人可以帮忙吗?
提前致谢,
塞巴斯蒂安
最佳答案
似乎主要问题是您没有 MessageBodyReader
配置为处理 JSON。您的类路径中有 jersey-media-json-jackson
,但您仍然需要注册提供程序。这就是不支持的媒体类型的原因。如果 Jersey 找不到处理转换的提供商,这就是您将获得的状态。
如果您使用的是web.xml,则可以使用
<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>
jersey.web.stackoverflow, <!-- your package -->
org.codehaus.jackson.jaxrs <!-- jackson package -->
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
如果您使用的是 ResourceConfig
类,那么您可以这样做
public class AppConfig extends ResourceConfig {
public AppConfig() {
register(JacksonFeature.class);
}
}
修复此问题后您可以期待什么
不确定您如何发送数据,我不知道 BigDataMock 是什么,但如果 Jackson 无法读取它,您可能会收到 400 Bad Request
评论中还提到,您的 GET 重定向方法中的 @Produces
很可能会遇到另一个问题。该内容类型将不受支持,您需要为其编写自定义 MessageBodyWriter
,或者简单地使用 application/octect-stream
。
您还需要一个 FileContent
的默认(无参数)构造函数。 Jackson 需要这个来创建 POJO。
更新
所以我猜 @Produces
不是问题。我能够让它工作,只需解决主要问题,第一个项目符号和最后一个项目符号。我也改变了
String startDateStr = new Date().toString();
// TO
long startDateStr = new Date().getTime();
我猜(至少对于使用 Windows 的我来说)这是一个错误的文件名格式。
关于Java Jersey 415(不支持的媒体类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28644268/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!